我有一个本地的python代码仓库,如下所示。
在python/foo/code.py
中,我想在target_module
中导入foo/bar/baz/target_module
。但是,由于code.py
在foo
模块下,因此无法导入target_module
。由于它是带有大量旧代码的大型仓库,因此我无法轻松更改任何目录名称。还有其他解决方法吗?
谢谢!
|──foo | ├──bar | ├──baz | ├── target_module ├── python | ├── foo | │ ├── code.py <----from foo.bar.baz.target_module import *
答案 0 :(得分:2)
有两种方法可以执行此操作。快速而肮脏的只是将其添加到您的解释器的路径中。
这是我的设置:
Matthews-MacBook-Pro:test_project matt$ tree
.
├── foo
│ └── bar
│ └── baz
│ └── target_module.py
└── python
└── foo
└── code.py
5 directories, 2 files
这是target_module.py
的内容:
def my_func():
print("my func called.")
以及如何将此函数导入code.py
:
import os
import sys
# Cheat and just add it to python interpreter's path
this_dir = os.path.dirname(__file__)
sys.path.append(os.path.join(this_dir, "..", "..", "foo", "bar", "baz"))
import target_module as tm
tm.my_func()
此输出:
Matthews-MacBook-Pro:test_project matt$ python python/foo/code.py
my func called.
或者您可以从foo
目录中调用它,它仍然可以正常工作:
Matthews-MacBook-Pro:test_project matt$ cd python/foo/
Matthews-MacBook-Pro:foo matt$ python code.py
my func called.
您也可以仅将foo/bar/baz
目录添加到您的PYTHONPATH
环境变量中,而不用调用sys.path.append
。此语法取决于外壳程序:因此,我将让您用谷歌搜索如何为您的特定外壳程序设置环境变量。
理想情况下,您希望使模块可部署(即,使用setup.py
和distutils
或setuptools
并将__init__.py
放入每个模块),然后可以“正常”导入(有点像您可以“仅” import numpy
导入)。 但是由于您声称它是传统,因此可能很难完成。我明白了:在旧系统中,所有赌注都没有了,有时快速而肮脏的还不错(如果您不想花费很多时间解决此问题,那甚至是理想的选择。)
如果您对创建可部署的python包感兴趣,我可以扩展此答案,如果没有,上面的内容应该可以完成工作。
HTH。