42

我在一个项目中有一些代码,我想在另一个项目中重用它们。我需要做什么(在两个文件夹中)才能做到这一点?

目录结构类似于:

    • 项目1
      • 文件1.py
      • 文件2.py
  • 酒吧
    • 项目2
      • 文件X.py
      • 文件Y.py

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

4

5 回答 5

46

理想情况下,这两个项目都是一个可安装的 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

然而,真正的答案是让每一个都成为一个独立的可安装包。

于 2013-01-24T19:42:45.540 回答
8

这里发生了很多事情。您应该阅读有关 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 *非常不受欢迎的,因为它混合了名称并使代码的可读性和可理解性降低

于 2013-01-24T19:40:14.593 回答
5

您可能想用它制作一个模块,然后从中导入您需要的任何东西。

于 2013-01-24T19:32:41.683 回答
3

您获取要在两个项目中使用的代码,然后将其放入一个模块中,然后将其提取到第三个单独的项目中。你把那个项目做成一个包,你可以单独处理它。然后你发布它的版本,并在你的其他项目中重用它们。

拥有可以“发布”的版本非常重要,这样您就可以跟踪每个项目使用的模块版本。否则,您最终会遇到旧项目停止工作的情况,因为您对公共模块进行了不兼容的更改。

如果它不仅对您而且对其他人普遍可用,请考虑将其上传到PyPI

于 2013-01-24T19:39:32.247 回答
-1

我认为您可以使用or和 do添加Foo到当前 Python 路径。os.path.join()os.path.append()from import Project1.file1 import function_name

于 2013-01-24T19:36:03.827 回答