Python 如何在模块和主模块中使用相对导入
我在python中设置了以下库:Python 如何在模块和主模块中使用相对导入,python,python-2.7,import,Python,Python 2.7,Import,我在python中设置了以下库: library | - __init__.py | - lib1.py | - ... | - tools | - __init__.py | - testlib1.py 因此换句话说,目录库包含python模块,目录工具,它是库的子目录,包含例如一个文件testlib1.py来测试库lib1.py testlib1.py因此需要从上面的目录导入lib1.py来执行一些测试等,只要从计算机上的某个地方调用pyth
library
| - __init__.py
| - lib1.py
| - ...
| - tools
| - __init__.py
| - testlib1.py
因此换句话说,目录库
包含python模块,目录工具
,它是库
的子目录,包含例如一个文件testlib1.py
来测试库lib1.py
testlib1.py
因此需要从上面的目录导入lib1.py
来执行一些测试等,只要从计算机上的某个地方调用python testlib1.py
,假设文件位于搜索路径中。
此外,我只希望指定一个PYTHONPATH
但是我们都知道以下关于testlib1.py
的想法不起作用,因为相对导入不起作用:
from .. import lib1
...
do something with lib1
我接受两种答案:
testlib1.py
作为正在执行的python脚本李>
项目中,并且工具必须位于与实际库不同的目录中李>
如果有什么不清楚的地方,我建议提问,我会更新问题 尝试向工具
目录添加一个\uuuu init\uuuu.py
。相对导入应该可以工作。您不能。如果计划使用相对导入,则无法单独运行模块。
要么放弃相对导入,要么放弃直接运行testlib1.py
的想法
我还认为测试文件不应该使用相对导入。测试应该检查库是否工作,因此代码应该尽可能与用户实际使用的代码相似。通常用户不会将文件添加到库中以使用相对导入,而是使用绝对导入
顺便说一句,我认为您的文件组织过于“java化”:混合了源代码和测试。如果您想进行测试,那么为什么不进行以下测试:
project/
|
+-- src/
| |
| +--library/
| | |
| | +- lib1.py
| | |
| | #...
| +--library2/ #etc.
|
+-- tests/
|
+--testlibrary/
| |
| +- testlib1.py
#etc
要运行测试,只需使用像NoTests这样的工具,它会自动查找这种文件夹结构,并提供大量选项来更改搜索/测试设置。实际上,我找到了一个解决方案,它可以
使用当前的实现
不需要对PYTHONPATH进行任何更改
无需硬编码顶级lebel目录
在testlib1.py
中,以下代码可以(已测试):
不完全确定这是一个非常干净或简单的解决方案,但它允许从目录中导入一级以上的任何模块,这正是我所需要的(因为测试代码或额外代码,或者无论何时都位于实际模块文件的下一级)。不是。我把问题缩减了。哦,您还必须将testlib1作为一个包运行——比如:python-m library.tools.testlib1这也不是一个解决方案:我需要testlib1.py
从系统中的任何位置运行,而不必进入此目录。当我尝试按照您的建议执行此操作时,我得到一个错误/usr/bin/python:没有名为testrunner的模块
。另请参见关于PYTHONPATH的更新问题您的PYTHONPATH
是否包含library/
的父目录?@tom:是的,例如,要在其他一些不相关的文件中导入lib1.py
,我会从库导入lib1
。如果library/
在您的PYTHONPATH
中,然后您应该完全从您的测试模块导入lib
。i、 e.从库导入lib1
。
import os
import sys
dirparts = os.path.dirname(os.path.abspath(__file__)).split('/')
sys.path.append('/'.join(dirparts[:-1]))
import mylib1