Python 包内和包外导入

标签 python python-3.x import

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

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

相关文章:

c++ - 使用 C++ 在 QT 中加载 COM DLL(无 header )?

python - selenium.common.exceptions.SessionNotCreatedException : Message: Unable to find a matching set of capabilities with GeckoDriver, Selenium 和 Firefox

python - pandas:检查空值:按行应用此函数我做错了什么?

python - 获取 Pandas 数据框中每一行的第二大值的列名

python - 元组实例在枚举类中没有成员(pylint no-member)

Tornado 未正确返回 HTTP 状态消息

javascript - 在 main.ts (typescript) 内的一个函数中加载外部 javascript 函数

python - 使用 PyDrive 将大文件上传到 Google Drive

python - 为什么我的 CreateAPIView 不显示产品和商店类别字段?

objective-c - 如何将 Swift 代码导入 Objective-C?