这就是我的情况。我有以下目录结构:
$ls -R .:
driver.py package
./package:
dependent.py __init__.py standalone.py
驱动程序.py:
#!/usr/bin/env python
from package.dependent import add_n
if __name__=='__main__':
print(add_n(2,2))
依赖.py:
#!/usr/bin/env python
from standalone import add_1
def add_n(x, n):
for _ in range(n):
x = add_1(x)
return x
独立.py:
#!/usr/bin/env python
def add_1(x):
return x+1
现在,根据我的用例,我想直接运行 dependent.py
或将其导入到 driver.py
中。这就是我面临的问题:
- 仅当导入
add_1
时没有点时,运行dependent.py
才有效。如果存在,则会抛出以下错误:
Traceback (most recent call last):
File "dependent.py", line 3, in <module>
from .standalone import add_1
ModuleNotFoundError: No module named '__main__.standalone'; '__main__' is not a package
- 仅当导入
add_1
时有一个点时,运行package.py
才有效。如果没有,则会抛出以下错误:
Traceback (most recent call last):
File "driver.py", line 3, in <module>
from package.dependent import add_n
File "/home/su0/scratch/package/dependent.py", line 3, in <module>
from standalone import add_1
ModuleNotFoundError: No module named 'standalone'
我希望这两种方案都能发挥作用。这是因为,在实际项目中,包内存在导入其他模块的依赖关系。我也希望能够将其作为包导入。如有任何帮助,我们将不胜感激。
谢谢。
最佳答案
最好的办法是真的 package代码,然后在 dependent.py 中使用绝对导入。不过,您可以使用以下选项之一作为解决方法:
扩展driver.py中的路径
在import package.dependent
之前,您可以添加以下行:
import sys
sys.path.append('package')
然后在dependent.py
中使用不带点的导入语句。这是有效的,因为现在 package
位于要搜索模块的路径上,包括 standalone.py
。
在 dependent.py 中使用条件导入
您可以修改dependent.py
中的导入,如下所示:
if __name__ == '__main__':
from standalone import ...
else:
from .standalone import ...
关于Python 包内和包外导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319336/