我在一个项目中有一些代码,我想在另一个项目中重用它们。我需要做什么(在两个文件夹中)才能做到这一点?
目录结构类似于:
- 富
- 项目1
- 文件1.py
- 文件2.py
- 项目1
- 酒吧
- 项目2
- 文件X.py
- 文件Y.py
- 项目2
我想在 fileX.py 和 fileY.py 中使用来自 file1.py 和 file2.py 的函数。
理想情况下,这两个项目都是一个可安装的 python 包,包含 __init__.py 和 setup.py。然后可以使用python setup.py install
或类似方式安装它们。
如果这是不可能的,请不要使用execfile()
!操作PYTHONPATH
添加Foo
以便import Project1.file1
工作。
例如,来自 Project2/fileX.py:
from os import path
import sys
sys.path.append(path.abspath('../Foo'))
from Project1.file1 import something
然而,真正的答案是让每一个都成为一个独立的可安装包。
这里发生了很多事情。您应该阅读有关 python 包和模块管理的信息http://docs.python.org/2/tutorial/modules.html#packages但基本思想是 fileX 需要知道 file1 和 file2 在哪里才能使用它们。
要将文件夹变成一个包,它只需要包含一个__init__.py
文件。我建议你做的是(在终端中)
$ touch Foo/__init__.py
$ touch Foo/Project1/__init__.py
(假设您使用的是 unix/linux)。
然后不知何故,fileX 需要知道Foo
包在哪里。你可以调用sys.path.append(PATH)
where PATH 是 Foo 的位置。
最后在 fileX.py 里面你会有
import sys
sys.path.append(PATH) #replace PATH with the path to Foo
from Foo.Project1 import file1
#use its functions
file1.function_name(argument)
如果您真的只想说function_name
没有前面的file1.
内容,您可以通过说from Foo.Project1.file1 import *
但是请注意这from module import *
是非常不受欢迎的,因为它混合了名称并使代码的可读性和可理解性降低
您可能想用它制作一个模块,然后从中导入您需要的任何东西。
我认为您可以使用or和 do添加Foo
到当前 Python 路径。os.path.join()
os.path.append()
from import Project1.file1 import function_name