我已经提到了几个主题和文章,包括:
但无法获得理想的结果。
假设我有一个名为“helloworld”的目录:
helloworld
|--__init__.py
|--say_hello.py
|--another_hello
|--__init__.py
|--import_hello.py
这是say_hello.py:
def hello_world():
print("Hello World!")
if __name__ == "__main__":
hello_world()
这是import_hello.py:
from .. import say_hello
say_hello.hello_world()
我希望在不使用say_hello
模块的情况下,无论何时拨打python /path/to/import_hello.py
导入sys
模块。
但是,现在当我python /path/to/import_hello.py
时,它将返回ValueError: attempted relative import beyond top-level package
,我不知道为什么它不起作用。
即使这不起作用:
from helloworld import say_hello
say_hello.hello_world()
它会给我ModuleNotFoundError: No module named 'helloworld'
。
答案 0 :(得分:1)
你不能像这样从包中间运行脚本。执行此操作后,如果您在helloworld.another_hello.import_hello
之外运行/path/to/helloworldsparent/
,则表示您正在__main__
内运行/path/to/helloworldsparent/helloworld/another_hello
。因此,它没有import
的父包作为..
。
您可以使用-m
运行模块:
$ python -m helloworld.another_hello.import_hello
...假设helloworld
的目录位于sys.path
上(例如,因为您已将其安装到site-packages
中,或者因为您当前的工作目录是其父目录,或者因为您已经设置了PYTHONPATH
。
但更清晰的解决方案通常是单独留下深层模块,并在顶层写入“入口点”脚本,如下所示:
import helloworld.another_hello.import_hello
helloworld.another_hello.import_hello.main()
如果你正在使用setuptools
(并且你真的应该为任何复杂到足以需要两个级别的包),你可以让它在安装时自动创建入口点脚本(或{{1时间,在开发期间)。请参阅文档中的Automatic Script Creation(但您可能还需要阅读其他部分以获取整个想法;文档非常庞大且复杂)。
答案 1 :(得分:0)
我觉得您可以先尝试将父路径添加到系统路径,然后尝试使用导入。
from sys import path as pylib
import os
pylib += os.path.abspath('..')
from helloworld import say_hello
希望它有所帮助!!