我制作了很多小的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
可以按预期工作?
给出以下目录结构:
import my_package.some_code
在我的packages/
my_package/
__init__.py
my_package/
__init__.py
hello_world.py
中有packages
目录。如何组成PYTHONPATH
,使__init__.py
有效?
答案 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
当然,这仅适用于实际源代码位于目录下的软件包。最好以特定于软件包的格式处理此问题。