如果我有这样的目录
dir_one/
main.py
__init__.py
dir_two/
sub.py
__init__.py
我的两个初始化.py文件当前都是空的。在我的sub.py文件中,我尝试从main.py导入一个类:例如
#File:sub.py
from main import items
哪个没有用。我也试过了
#File:sub.py
from dir_one.main import items
这也没有用。
有没有办法从导入main.py
文件sub.py
?__init__.py
给定它为空,我是否需要编辑?
您在这里有一些选择。
最好的选择是使程序包与使用该程序包的脚本分开。看看entry_points
setuptools。您将setuptools指向包中的一个函数,它会创建一个脚本来调用它。好漂亮
为了解决这个问题,我建立了以下包结构:
test_dir
+ __init__.py
+ main.py
+ sub1
--+ __init__.py
--+ script.py
+ sub2
--+ __init__.py
--+ module.py
并且我已经确保test_dir
可以通过进行访问PYTHONPATH
。
这些脚本都非常简单(只需打印一些内容):
# main.py
def func_in_main():
print("Hello from main.py!")
# module.py
def run_func():
print("Hello from script in sub2.py!")
# script.py
from ..sub2 import module
from .. import main
def entry_point():
module.run_func()
main.func_in_main()
if __name__ == '__main__':
entry_point()
现在,如果我尝试直接运行此命令会发生什么?
$ python test_package/test_dir/sub1/script.py
Traceback (most recent call last):
File "test_package/test_dir/sub1/script.py", line 2, in <module>
from ..sub2 import module
ValueError: Attempted relative import in non-package
嗯... Bummer(我试图在关于您原始问题的评论中描述这种情况)。不管我当前的工作目录如何,都会发生这种情况...但是,在文件系统上的任何地方,我都可以使用-m
标志1运行它:
$ python -m test_dir.sub1.script
Hello from script in sub2.py!
Hello from main.py!
霍雷!我们只需要指定模块路径,然后我们就可以了(记住,test_dir
必须通过您的PYTHONPATH可以访问此路径才能起作用)。好的,但是如果我们真的要调用脚本而不使用模块路径怎么办?如果是这种情况,我们可以__package__
在进行任何导入之前修改变量:
# script.py (updated)
if __name__ == '__main__' and __package__ is None:
__package__ = 'test_dir.sub1'
import test_dir # needed to suppress SystemError -- I'm not sure why...
from .. import main
from ..sub2 import module
def entry_point():
module.run_func()
main.func_in_main()
if __name__ == '__main__':
entry_point()
现在,让我们尝试再次直接运行此东西:
$ python test_package/test_dir/sub1/script.py
test_package/test_dir/sub1/script.py:4: RuntimeWarning: Parent module 'test_dir.sub1' not found while handling absolute import
import test_dir
Hello from script in sub2.py!
Hello from main.py!
我们仍然得到RuntimeWarning
,但运行正常。有关更多详细信息,请参阅PEP-0366。
1总的来说,我大多数都是从程序包外部运行的(高于一级test_dir
),但是如果我也从包内部运行这些示例,那么这些示例也可以工作。与-m
你总是指定的模块(完整路径test_dir.sub1.script
),如果没有它,你只要指定文件的相对或绝对路径)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句