[英]Import a module from the parent directory within packages
我已经提到了几个主题和文章,包括:
却得不到想要的结果。
假设我有一个名为“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
module 。
但是,现在当我执行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'
。
你不能在这样的包中间运行脚本。 当你这样做,你没有运行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
(并且您确实应该使用足够复杂的任何东西以需要两个级别的包),您可以让它在安装时(或在--inplace
时,在开发期间)自动创建入口点脚本。 请参阅文档中的自动脚本创建(但您可能还需要阅读其他部分以了解整个想法;文档非常大且复杂)。
我觉得你可以先尝试将父路径添加到系统路径中,然后尝试使用导入。
from sys import path as pylib
import os
pylib += os.path.abspath('..')
from helloworld import say_hello
希望能帮助到你 !!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.