在Python开发中使用共享模块的正确方法是什么?

时间:2013-06-18 17:15:15

标签: python python-3.x distutils

我正在努力将Python作为我团队开发工具套件的一部分。使用我们使用的其他语言/工具,我们开发了许多可重用的函数和类,这些函数和类特定于我们的工作。这标准化了我们做事的方式,并节省了大量的车轮重新发明。

我似乎无法找到通常用Python处理它的任何示例。现在我在本地驱动器上有一个开发文件夹,下面有多个项目文件夹,还有一个包含可重复使用的类和函数的包和模块的附加“公共”文件夹。这些“通用”模块由多个项目中的模块导入。

Development/
    Common/
        Package_a/
        Package_b/
    Project1/
        Package1_1/
        Package1_2/
    Project2/
        Package2_1/
        Package2_2/

在尝试学习如何分发Python应用程序时,似乎假设所有引用的包都低于顶级项目文件夹,而不是它的附属物。我还想到,也许正确的方法是在单独的项目中开发通用/框架模块,并且经过测试,通过安装到site-packages文件夹将它们部署到每个开发人员的环境中。然而,这也引发了重新分配的问题。

任何人都可以阐明这一点,或者指出我讨论这个问题的资源吗?

4 个答案:

答案 0 :(得分:8)

这种东西必须首先阅读:

What is the best project structure for a Python application?

如果您还没有看到它(并按照第二个答案中的链接)。

关键是每个主要包都可以导入,就好像“。”是顶级目录,这意味着它在安装在站点包中时也能正常工作。这意味着主要包应该在顶级目录中都是平的,如:

myproject-0.1/
    myproject/
        framework/
    packageA/
        sub_package_in_A/
            module.py
    packageB/
        ...

然后您(在其他软件包中)和您的用户都可以导入为:

import myproject
import packageA.sub_package_in_A.module

这意味着您应该仔细考虑@ MattAnderson的评论,但如果您希望它显示为可单独分发的软件包,则需要位于顶级目录中。

请注意,这并不能阻止您(或您的用户)执行以下操作:

import packageA.sub_package_in_A as sub_package_in_A

但它确实阻止你允许:

import sub_package_in_A

直接

答案 1 :(得分:6)

如果您希望在多个项目中共享公共代码,则可能需要考虑将此代码存储在物理上独立的项目中,然后将其作为依赖项导入到其他项目中。如果您在github或bitbucket中托管公共代码项目,可以轻松实现这一点,您可以使用pip在任何其他项目中安装它。这种方法不仅可以帮助您轻松地跨多个项目共享公共代码,还可以帮助您避免无意中创建错误的依赖项(即从公共代码指向非公共代码的依赖项)。

下面的链接提供了使用pip和virtualenv来管理依赖关系的一个很好的介绍,如果你和你的团队使用python相当新,这绝对值得一读,因为这是一个非常常见的工具链,用于这种问题:

http://dabapps.com/blog/introduction-to-pip-and-virtualenv-python/

下面的链接向您展示了如何使用pip从github获取依赖关系:

How to use Python Pip install software, to pull packages from Github?

答案 2 :(得分:2)

我认为这是创建可分发的python包的最佳参考:

链接已删除,因为它会导致被黑网站攻击。

另外,不要觉得您需要将所有内容嵌套在一个目录下。你可以做像

这样的事情
platform/
    core/
        coremodule
    api/
        apimodule

然后执行from platform.core import coremodule

之类的操作

答案 3 :(得分:2)

  

......似乎假设所有引用的包   在顶级项目文件夹下面,而不是它的附属物。

这主要是因为当前工作目录是默认情况下sys.path中的第一个条目,这使得在该目录下导入模块和包非常方便。

如果删除它,甚至无法从当前工作目录中导入内容......

$ touch foo.py
$ python
>>> import sys
>>> del sys.path[0]
>>> import foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named foo
  

我也想到了也许正确的方法   在一个单独的项目中开发公共/框架模块,并且一次   测试,通过安装到每个开发人员的环境部署   site-packages文件夹。

这不是一个真正的发展问题。如果您正在使用版本控制,并且所有开发人员都检查了相同结构中的源代码树,您可以轻松地使用relative path hacks来确保代码正常工作,而不必使用环境变量或符号链接。

  

然而,这也引发了重新分配的问题。

这可能会让事情变得更复杂,但前提是您计划独立于使用它们的项目发布库,和/或让多个项目安装程序共享相同的库。就是这样,看看distutils

如果没有,您可以简单地使用开发中使用的相同路径黑客,以确保您的项目“开箱即用”。