Python导入包内外

时间:2019-03-23 23:30:05

标签: python python-3.x import

这是我的情况。我具有以下目录结构:

$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'

我希望这两种情况都能正常工作。这是因为在实际项目中,包中存在依赖关系,这些依赖关系会导入其他模块。而且我也希望能够将其作为软件包导入。任何帮助表示赞赏。

谢谢。

1 个答案:

答案 0 :(得分:0)

最好是真正地package代码,然后在dependent.py中使用绝对导入。作为解决方法,您可以使用以下选项之一:

扩展driver.py中的路径

import package.dependent之前,您可以添加以下行:

import sys
sys.path.append('package')

然后在dependent.py中使用不带点的import语句。自从package进入要搜索模块(包括standalone.py)的路径以来,此方法就起作用了。

在dependent.py中使用条件导入

您可以按以下步骤修改dependent.py中的导入:

if __name__ == '__main__':
    from standalone import ...
else:
    from .standalone import ...