[英]Importing modules from separate paths in Python
我正在嘗試從單獨的路徑導入模塊,但是返回的錯誤是“找不到模塊”。 它從執行腳本的目錄中導入模塊,但不會更改目錄並從該目錄中導入。
print(os.getcwd())
當我運行它時,在拋出錯誤之前找不到模塊,它將輸出父目錄,因此例如,我將使用test \\ import \\ modules 。
我將在\\ import \\中運行一個腳本,以從\\ import \\中導入test_0.pyd和從\\ modules中 導入 test_1.pyd(test.py和test_0位於\\ import \\中,而test_1位於\\ modules中 。此外,我還有嘗試了相對導入,並且每個目錄都包含init .py )。
import test_0 # this would work
from modules import test_1 # throws error that module isn't found
因此,我運行了print命令,它返回的是它試圖從test \\導入,並且我嘗試過更改目錄,但是它將說工作目錄在我打印時已更改,但仍然輸出找不到模塊。 非常感謝您的任何幫助,謝謝。
編輯 http://prntscr.com/6ch7fq-執行test.py http://prntscr.com/6ch80q-導入目錄
當您從某個目錄啟動python時,該目錄將添加到您的PYTHONPATH
因此可以從該目錄及其下導入模塊,前提是您在每個目錄中都有一個__init__.py
,其中包括從其運行python的頂層。 看這里:
~/Development/imports $ tree . ├── __init__.py ├── mod1 │ ├── __init__.py │ ├── a.py ├── mod2 │ ├── __init__.py │ ├── b.py ├── top.py
因此,當我們從~/Development/imports/
啟動python時,我們可以訪問top
mod1.a
和mod2.b
:
~/Development/imports $ python
Python 2.7.8 (default, Nov 3 2014, 11:21:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import top
>>> import mod1.a
>>> import mod2.b
>>> import sys
但是,當我們從內部開始蟒蛇mod1
,我們不允許到外面去的mod1
回top
或mod2
:
~/Development/imports/mod1 $ python
Python 2.7.8 (default, Nov 3 2014, 11:21:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> from .. import top
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Attempted relative import in non-package
>>> from ..mod2 import b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Attempted relative import in non-package
from ..mod2 import b
相對from ..mod2 import b
只能在您從其開始的頂級模塊下面的模塊中工作,因為它們都隱式位於python路徑中。
你無法逃避你,除非那個特定的路徑添加到啟動模塊之外 PYTHONPATH
或sys.path
:
~/Development/imports/mod1 $ PYTHONPATH=../ python
Python 2.7.8 (default, Nov 3 2014, 11:21:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> import top
>>> import top.mod2.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named mod2.b
>>> import sys
>>> sys.path.append('~/Development/imports/mod2/')
>>> from mod2 import b
>>>
因此,您需要確保所有目錄中都有__init__.py
文件。 您還需要確保從正確的位置(通常是頂層目錄)啟動python。 您無法在目錄結構的一半以下啟動python並期望回到頂部,或側向另一個目錄/模塊。
在上述模塊/目錄中是否有__init__.py
文件? 這是python將其視為包所必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.