这是我的情况。我具有以下目录结构:
$ls -R .:
driver.py package
./package:
dependent.py __init__.py standalone.py
driver.py:
#!/usr/bin/env python
from package.dependent import add_n
if __name__=='__main__':
print(add_n(2,2))
dependent.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
standalone.py:
#!/usr/bin/env python
def add_1(x):
return x+1
现在取决于我的用例,我想直接运行dependent.py
或将其导入driver.py
。这是我面临的问题:
dependent.py
仅在导入add_1
时只有 的情况下有效。如果有一个,它将引发以下错误: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
package.py
仅在导入add_1
时出现 的情况下有效。如果没有,则会引发以下错误: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'
我希望这两种情况都能正常工作。这是因为在实际项目中,包中存在依赖关系,这些依赖关系会导入其他模块。而且我也希望能够将其作为软件包导入。任何帮助表示赞赏。
谢谢。
答案 0 :(得分:0)
最好是真正地package代码,然后在dependent.py
中使用绝对导入。作为解决方法,您可以使用以下选项之一:
在import package.dependent
之前,您可以添加以下行:
import sys
sys.path.append('package')
然后在dependent.py
中使用不带点的import语句。自从package
进入要搜索模块(包括standalone.py
)的路径以来,此方法就起作用了。
您可以按以下步骤修改dependent.py
中的导入:
if __name__ == '__main__':
from standalone import ...
else:
from .standalone import ...