簡體   English   中英

從Python中的單獨路徑導入模塊

[英]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.amod2.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 ,我們不允許到外面去的mod1topmod2

~/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路徑中。

你無法逃避你,除非那個特定的路徑添加到啟動模塊之外 PYTHONPATHsys.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將其視為包所必需的。

看看__init__.py的作用是什么?

暫無
暫無

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

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