在Python中从不同路径导入模块

2021-05-13 15:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

print(os.getcwd())

当我运行这个函数时,在它抛出找不到模块的错误之前,它将输出父目录,因此我将使用test\import\modules。在

我将在\import\中运行一个脚本,从\import\导入test_0.pyd,从\modules导入test_1.pyd(测试.py测试单元0位于\import\中,测试单元1位于\modules中。另外,我尝试过相对导入,每个目录都包含init.py)。在

^{pr2}$

所以我运行print命令,它返回它试图从test\导入,我已经尝试过更改目录,但是当我打印时,它会说工作目录改变了,但是仍然输出它找不到模块。非常感谢任何帮助,谢谢。在

编辑http://prntscr.com/6ch7fq-正在执行测试.py http://prntscr.com/6ch80q-导入目录

2条回答
网友
1楼 ·

在上述模块/目录中是否有__init__.py文件?这是python将其视为一个包所必需的。在

退房What is __init__.py for?

网友
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时,我们可以访问topmod1.a和{}:

~/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或{}:

^{pr2}$

相对导入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,然后期望返回到顶部,或者侧向到另一个目录/模块。在

相关问题