我正在尝试从单独的路径导入模块,但它返回的错误是“找不到模块”。它从执行脚本的目录中导入模块,但不会更改目录并从目录导入。
print(os.getcwd())
当我运行它时,在它抛出错误之前它无法找到模块,它将输出父目录,所以例如我将使用 test \ import \ modules 。
我将在 \ import \ 中运行一个脚本,从 \ import \ 导入test_0.pyd,从 \ modules 导入test_1.pyd (test.py和test_0位于 \ import \ ,test_1位于 \ modules 。此外,我尝试过相对导入,每个目录都包含 初始化的.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 - 导入目录
答案 0 :(得分:2)
当您从目录启动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
内部启动python时,我们不允许超出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
仅适用于您从顶层模块开始的模块,因为它们都隐含在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,并期望返回到顶层,或者侧面到另一个目录/模块。
答案 1 :(得分:0)
您在所说的modules /目录中有__init__.py
个文件吗?这是python将其视为包的必要条件。