我如何编写python import语句,使文件在其包内外都能工作?



下面是我正在使用的文件结构:

package_example/
main.py
the_package/
__init__.py
pkg_file_1.py
pkg_file_2.py

文件如下:

# main.py
from the_package.pkg_file_1 import foo_1

def main():
foo_1()

if __name__ == "__main__":
main()
# pkg_file_1.py
from the_package import pkg_file_2

def foo_1():
print("this is the second version, foo_1")
pkg_file_2.foo_2()

if __name__ == "__main__":
foo_1()
# pkg_file_2.py
def foo_2():
print("this is foo_2")

如果我运行main.py,一切正常。

但是如果我运行pkg_file_1.py,我得到:

Traceback (most recent call last):
File "the_package/pkg_file_1.py", line 1, in <module>
from the_package import pkg_file_2
ModuleNotFoundError: No module named 'the_package'

显然,在这个简化的示例中,这无关紧要,因为main.pypkg_file_1.py运行相同的代码。

但是实际上,我在包结构中嵌入了测试脚本,所以我可以在新的环境和数据中测试代码。但是我很挠头,我应该如何编写import语句,这样我就不会从包内或包外获得ModuleNotFoundError

编辑:根据pavel的建议,我尝试将pkg_file_1.py更改为:

from ..the_package import pkg_file_2

def foo_1():
print("this is the second version, foo_1")
pkg_file_2.foo_2()

if __name__ == "__main__":
foo_1()

但是运行相同的文件会得到:

Traceback (most recent call last):
File "the_package/pkg_file_1.py", line 1, in <module>
from ..the_package import pkg_file_2
ImportError: attempted relative import with no known parent package

这就是为什么我们需要相对导入。

# pkg_file_1.py
from . import pkg_file_2
...

如何运行main.pypkg_file1.pypackage_exampledir:

python3 main.py
python3 -m the_package.pkg_file1

最新更新