使用__init__从子文件夹文件的父目录中导入?

沃辛

如果我有这样的目录

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_pointssetuptools。您将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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章