使用python __init__.py来“跳过”目录

时间:2018-08-16 14:28:14

标签: python

我制作了很多小的python软件包来帮助解决这个问题。因此,我有一个目录,例如/packages,我想保留所有方便的工具,并将其放在python路径$export PYTHONPATH=/packages上。

现在假设我将__init__.py放入/packages/my_package中。我可以成功$python -c "import my_package"。但是,如果我使用目录结构(因为我仍然有文档和其他内容)做/packages/my_package/my_package/hello_world.py,这很典型,那么在__init__.py中使用/packages/my_package/my_package不足以导入{ {1}}。我可以在我的根some_code.py中添加一个__init__.py,但随后必须添加/package/my_package,这与常规的“已安装”导入方式冲突。如何设置根级别的import my_package.my_package.hello_world,以便导入“跳过”中间的“代码”目录,而__init__.py可以按预期工作?

tl; dr

给出以下目录结构:

import my_package.some_code

在我的packages/ my_package/ __init__.py my_package/ __init__.py hello_world.py 中有packages目录。如何组成PYTHONPATH,使__init__.py有效?

3 个答案:

答案 0 :(得分:2)

您需要在每个 init.py 文件中编写导入。您可以尝试以下代码,可能需要根据需要进行一些修改。但这总会是格式。

packages/
    my_package/
        __init__.py
        **from .my_package import main** 


        my_package/
            __init__.py
            **from .hello_world import main** 


            hello_world.py

            def main():
                #Do something

答案 1 :(得分:1)

给出重复数据删除的目录结构:

packages/
    my_package1/
        __init__.py
        my_package2/
            __init__.py
            hello_world.py

__init__.py的{​​{1}}文件中添加以下内容即可:

my_package1

这是from .my_package2 import hello_world 中的hello_world模块到父包my_package2中的相对导入。

答案 2 :(得分:0)

这以非python方式解决了我的特殊用例。我没有将class AddressBookViewController<T: AddressBookViewModelType> : UIViewController { private var viewModel: T! func configure(viewModel: T) { self.viewModel = viewModel } ... } 放在T上,而是编写了一个脚本,将其所有子目录都放在/packages上。这使我能够以“常规”方式使用所有模块,而不必安装它们,也不需要怪异的根PYTHONPATH。但是,它不能回答我的问题,我觉得必须有一种很好的pythonic方法来处理它。

具体来说,我将此放在PYTHONPATH的结尾

__init__.py

当然,这仅适用于实际源代码位于目录下的软件包。最好以特定于软件包的格式处理此问题。