如何从Python中的其他项目导入函数?

时间:2013-01-24 19:28:40

标签: python import

我在项目中有一些代码,我想在另一个项目中重用它。我需要做什么(在两个文件夹中)以便我可以这样做?

目录结构类似于:

    • PROJECT1
      • file1.py
      • file2.py
  • 酒吧
    • Project2的
      • fileX.py
      • fileY.py

我想在fileX.py和fileY.py中使用file1.py和file2.py中的函数。

5 个答案:

答案 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)

我认为您可以使用Fooos.path.join()os.path.append()添加到当前的Python路径并执行from import Project1.file1 import function_name