簡體   English   中英

Python模塊導入適用於一個文件,另一個文件失敗

[英]Python module import works for one file, fails for another

我面臨一個非常奇怪的問題。 我有三個文件,第一個包含基類,其他兩個文件中的類繼承自該基類。

奇怪的是,昨天一切正常,但其中一個文件今天不再起作用了。 在此期間我沒有觸及過進口商品。

.
└── orangecontrib
    ├──__init__.py
    └── prototypes
        ├──__init__.py
        └── widgets
            ├──__init__.py
            ├── owpythagorastree.py
            ├── owclassificationpythagorastree.py
            └── owregressionpythagorastree.py

因此,分類和回歸類需要從基類繼承,並且導入以完全相同的方式完成:

owclassificationpythagorastree.py

...
from orangecontrib.prototypes.widgets.owpythagorastree import OWPythagorasTree
...

owregressionpythagorastree.py

...
from orangecontrib.prototypes.widgets.owpythagorastree import OWPythagorasTree
...

然而,當我嘗試從命令行運行這兩個腳本(使用python owregressionpythagorastree.py )時,回歸小部件工作正常,但分類小部件會產生以下錯誤:

回溯(最近一次調用最后一次):文件“owclassificationpythagorastree.py”,第6行,來自orangecontrib.prototypes.widgets.owpythagorastree import OWPythagorasTree ImportError:沒有名為'orangecontrib.prototypes'的模塊

這種情況在其他項目中也曾多次發生,但它最終會自行解決。 但令我困擾的是,我不知道造成這種情況的原因。

我嘗試從我的常規機器和python virtualenv運行這個,我安裝了模塊(我在基本目錄中使用pip install -e . )。

我沒有看到這種行為的明顯原因,這讓我很煩惱,所以任何幫助或洞察為什么會發生這種情況以及如何解決這一問題將不勝感激。


編輯

根據要求,我運行了import sys; print(sys.path) import sys; print(sys.path)位於兩個腳本的頂部,在通過diff運行后,它們都完全相同。 不過,我在這里發布結果。

['/ home / pavlin / dev / orange3-prototypes / orangecontrib / prototypes / widgets','/ home / pavlin / dev / orange3','/ home / pavlin / dev / orange3env / lib / python3.5 / site -packages /setuptools_git-1.1-py3.5.egg','/ home / pavlin / dev / orange-bio','/ home / pavlin / dev / orange3env / lib / python3.5 / site -packages / pyqtgraph-0.9.10 -py3.5.egg','/ home / pavlin / dev / orange3env / lib / python3.5 / site-packages / request-9.1.1-py3.5.egg','/ home / pavlin / dev / orange3env /lib/python3.5/site-packages/slumber-0.7.1-py3.5.egg','/home/pavlin/dev/orange3env/lib/python3.5/site-packages/Genesis_PyAPI-1.2.0- py3.5.egg','/ usr / lib / python3.5 / site-packages / qt_graph_helpers-0.1.3-py3.5-linux-x86_64.egg','/ home / pavlin / dev / orange3-prototypes' ,'/ usr / lib / python3.5 / site-package','/ home / pavlin / dev / orange3env / lib / python35.zip','/ home / pavlin / dev / orange3env / lib / python3.5', '/home/pavlin/dev/orange3env/lib/python3.5/plat-linux','/home/pavlin/dev/orange3env/lib/python3.5/lib-dynload','/ usr / lib64 / python3。 5','/ usr / lib / python3.5','/ usr / lib / python3.5 / plat-linu x','/ home / pavlin / dev / orange3env / lib / python3.5 / site-package','/ usr / lib / python3.5 / site-package / setuptools-18.7.1-py3.5.egg' ,'/ home / pavlin / .local / lib / python3.5 / site-package']

看起來你的問題是對python如何找到模塊的不完全理解。

對於絕對導入 (即指定第一個模塊的名稱,例如import mymodule ,並且不使用句點從代碼所屬的包進行相對導入,例如from . import mymodule ),查找的順序是:

  1. 當前目錄。
  2. 您環境中PYTHONPATH中的任何目錄。
  3. 任何已安裝的系統路徑,可以通過各種方式設置。

要查看要從中導入的完整路徑集,請使用:

import sys
print(sys.path)

此外,請記住,如果目錄只有__init__.py文件,則該目錄是可導入的 - 您沒有說明您的代碼是否屬於這種情況。

因此,如果您有以下布局:

.
└── orangecontrib
    ├── __init__.py
    └── prototypes
        ├── __init__.py
        └── widgets
            ├── __init__.py
            ├── owpythagorastree.py
            ├── owclassificationpythagorastree.py
            └── owregressionpythagorastree.py

如果你從基目錄運行python orangecontrib/prototypes/widgets/owclassificationpythagorastree.py ,我希望如此. ,兩者都應該工作得很好,而不需要修改你的PYTHONPATH ,因為python總是首先在當前目錄中查找絕對導入的模塊。

如果你從widgets目錄運行,我希望它不起作用,除非你先將基目錄添加到PYTHONPATH

作為一般提示,除了非常小的東西,你應該避免將模塊代碼與腳本代碼混合,正是出於這些原因! 制作單獨的python腳本,這些腳本旨在從命令行運行,並單獨設計用於導入的python模塊代碼。 避免制作也可以作為腳本從命令行運行的模塊。

只是一個想法。 你檢查過權限了嗎? 也許某種程度上權限搞砸了,他們給你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM