我在项目中有一些代码,我想在另一个项目中重用它。我需要做什么(在两个文件夹中)以便我可以这样做?
目录结构类似于:
我想在fileX.py和fileY.py中使用file1.py和file2.py中的函数。
答案 0 :(得分:26)
理想情况下,两个项目都是可安装的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
然而,真正的答案是使每个都成为一个独立的可安装包。
答案 1 :(得分:6)
您可能希望从中输出module,然后从中导入任何内容。
答案 2 :(得分:5)
这里有很多事情要发生。你应该阅读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)
,其中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 *
1}} 高度不赞成,因为它混合了名称并使代码更易于阅读和理解
答案 3 :(得分:2)
您获取要在两个项目中使用的代码,并将其放入module,然后将其提取到第三个单独的项目中。您将该项目打包成一个包,您可以单独处理。然后,您将发布它的版本,并在其他项目中重复使用它们。
您拥有“发布”版本非常重要,这样您就可以跟踪每个项目使用的模块版本。否则,您将最终处于旧项目停止工作的情况,因为您对公共模块进行了不兼容的更改。
如果它不仅适用于您,也适用于其他人,请考虑将其上传至PyPI。
答案 4 :(得分:0)
我认为您可以使用Foo
或os.path.join()
将os.path.append()
添加到当前的Python路径并执行from import Project1.file1 import function_name
。