在Python中从单独的路径导入模块

时间:2015-03-04 05:04:58

标签: python import

我正在尝试从单独的路径导入模块,但它返回的错误是“找不到模块”。它从执行脚本的目录中导入模块,但不会更改目录并从目录导入。

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 - 导入目录

2 个答案:

答案 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.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内部启动python时,我们不允许超出mod1回到topmod2

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

除非将特定路径添加到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,并期望返回到顶层,或者侧面到另一个目录/模块。

答案 1 :(得分:0)

您在所说的modules /目录中有__init__.py个文件吗?这是python将其视为包的必要条件。

查看What is __init__.py for?