如何从当前文件夹旁边的文件夹导入模块?
我查阅了尽可能多的StackOverflow页面,尝试了所有找到的方法,但都没有成功。我还查看了关于导入的PEP页面,试过每一个例子,结果也都不行。
我有一个测试文件夹,里面放着单元测试,我需要导入我想测试的模块。这些模块在一个叫做'src'的文件夹里,而这个文件夹和测试文件夹是平行的。
文件夹和文件的结构大概是这样的:
Project /
src /
stringbuilder.py
__init__.py
tests /
stringbuilder_test.py
__init__.py
main.py
__init__.py
我尝试了所有能想到的方法:在每个文件夹里添加__init__.py
,让它们变成模块,包括项目的主文件夹。
import src.module_to_test
from ..src.module_to_test import function_to_test
from ..src import module_to_test
我测试了所有其他组合,但都失败了。我开始怀疑我的设置或理解上可能有问题——我以为这应该很简单。
如果我犯了什么明显的错误,请告诉我。
from tests import stringbuilder
错误信息:
$ ./stringbuilder_test.py
Traceback (most recent call last):
File "./stringbuilder_test.py", line 14, in <module>
from tests import stringbuilder
ImportError: No module named tests
对于(tests = src)也出现了同样的错误:
from src import stringbuilder
3 个回答
-10
把那个文件夹添加到你的 PATH
里。
1
from folder import my_module
如果在folder
文件夹里有一个__init__.py
文件。
13
如果脚本是在一个包里面执行的,那么就需要用一些小技巧来让导入的模块正常工作。最常见的办法就是调整一下 sys.path
这个路径。
import sys, os
sys.path.insert(0,
os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src import stringbuilder
del sys.path[0]
用普通的导入语句是无法做到这一点的。
更好的解决办法是干脆不要在包里面运行脚本。可以把所有的脚本放在包的外面,放在一个包含的目录里。因为当前运行的脚本所在的目录会自动加到 sys.path
的最前面,这样就能确保包可以直接导入,无论脚本从哪里执行。
所以,目录结构可能看起来像这样:
project /
package /
__init__.py
src /
__init__.py
stringbuilder.py
tests /
__init__.py
stringbuilder_test.py
main.py
test.py
然后 test.py
脚本可以这样导入它的测试:
from package.tests import stringbuilder_test
而 stringbuilder_test.py
可以这样导入 src
模块:
from package.src import stringbuilder