python本地模块相同

时间:2018-09-19 21:42:14

标签: python python-import

我有一个本地的python代码仓库,如下所示。 在python/foo/code.py中,我想在target_module中导入foo/bar/baz/target_module。但是,由于code.pyfoo模块下,因此无法导入target_module。由于它是带有大量旧代码的大型仓库,因此我无法轻松更改任何目录名称。还有其他解决方法吗?

谢谢!

|──foo
|   ├──bar
|         ├──baz
|               ├── target_module
├── python
|   ├── foo
|   │   ├── code.py      <----from foo.bar.baz.target_module import *

1 个答案:

答案 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.pydistutilssetuptools并将__init__.py放入每个模块),然后可以“正常”导入(有点像您可以“仅” import numpy导入)。 但是由于您声称它是传统,因此可能很难完成。我明白了:在旧系统中,所有赌注都没有了,有时快速而肮脏的还不错(如果您不想花费很多时间解决此问题,那甚至是理想的选择。)

如果您对创建可部署的python包感兴趣,我可以扩展此答案,如果没有,上面的内容应该可以完成工作。

HTH。