我有一个像下面这样的本地python代码repo。在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<----来自foo.bar.baz.target_module import *
发布于 2018-09-20 13:51:58
有几种方法可以做到这一点。快速而肮脏的是将它添加到解释器的路径中。
这是我的设置:
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
。这种语法依赖于shell:所以我会让你谷歌如何为你的特定shell设置环境变量。
理想情况下,您希望使您的模块可以部署(即使用setup.py
和/ distutils
或setuptools
放入__init__.py
每个模块),然后您可以“正常”导入(有点像您可以“只是” import numpy
并且它可以工作)。但既然你声称它的遗产,也许你可能很难完成。我明白了:在遗留系统中,所有的赌注都是关闭的,有时候快速和肮脏都很好(如果你不想花很多时间来解决这个问题,甚至可能是理想的)。
如果你对创建可部署的python包感兴趣,我可以扩展这个答案,如果没有,上面应该完成工作。
HTH。
https://stackoverflow.com/questions/-100008868
复制相似问题