gpt4 book ai didi

python - 从包内的父目录导入模块

转载 作者:行者123 更新时间:2023-12-01 09:19:39 27 4
gpt4 key购买 nike

我引用了多个主题和文章,包括:

但无法得到想要的结果。

假设我有一个名为“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()

我希望在调用 python/path/to/import_hello.py 的地方导入 say_hello 模块,而不使用 sys 模块。

但是,现在当我执行python/path/to/import_hello.py时,它将返回ValueError:尝试相对导入超出顶级包,并且我有不知道为什么它不起作用。

即使这样也行不通:

from helloworld import say_hello
say_hello.hello_world()

它会给我ModuleNotFoundError:没有名为“helloworld”的模块

最佳答案

您无法在这样的包中间运行脚本。当您这样做时,您运行的不是基于 /path/to/helloworldsparent/helloworld.another_hello.import_hello,而是运行 __main__ code> 基于 /path/to/helloworldsparent/helloworld/another_hello。因此,它没有可以导入..的父包。

<小时/>

您可以使用-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(并且您确实应该处理任何足够复杂的事情,需要两层包),您可以让它在安装时(或在安装时)自动创建入口点脚本--inplace 时间,开发期间)。请参阅Automatic Script Creation在文档中(但您可能还需要阅读其他部分才能了解整个想法;文档非常庞大且复杂)。

关于python - 从包内的父目录导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50902304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com