What is the proper way to work with shared modules in Python development?
我正在努力将Python作为团队开发工具套件的一部分。利用我们使用的其他语言/工具,我们开发了许多可重用的函数和类,这些函数和类是我们所做工作特有的。这使我们做事的方式标准化,并节省了许多车轮的重新发明。
我似乎找不到任何关于这通常如何用Python处理的例子。现在,我在本地驱动器上有一个开发文件夹,下面有多个项目文件夹,还有一个额外的"公用"文件夹,其中包含具有可重用类和函数的包和模块。这些"通用"模块由多个项目中的模块导入。
1 2 3 4 5 6 7 8 9 10 | Development/ Common/ Package_a/ Package_b/ Project1/ Package1_1/ Package1_2/ Project2/ Package2_1/ Package2_2/ |
在尝试学习如何分发Python应用程序时,似乎有一种假设,即所有引用的包都位于顶层项目文件夹之下,而不是附带到该文件夹中。我也想到,也许正确的方法是在一个单独的项目中开发公共/框架模块,并且一旦测试,通过安装到站点包文件夹,将这些模块部署到每个开发人员的环境中。然而,这也引发了重新分配的问题。
有人能解释一下这个问题吗,或者给我指出一个讨论这个问题的资源?
关于这类东西必须先读的是:
对于一个python应用程序,最好的项目结构是什么?
如果你还没有看到它(按照第二个答案中的链接)。
关键是每个主要包都是可导入的,就像"."是顶级目录一样,这意味着当安装在站点包中时,它也将正常工作。这意味着主要的包都应该在顶部目录中是平的,如:
1 2 3 4 5 6 7 8 | myproject-0.1/ myproject/ framework/ packageA/ sub_package_in_A/ module.py packageB/ ... |
然后,您(在其他包中)和您的用户都可以导入为:
1 2 | import myproject import packageA.sub_package_in_A.module |
等
这意味着您应该仔细考虑@matthanderson的评论,但是如果您希望它作为一个单独的可分发包出现,它需要在顶部目录中。
注意,这不会阻止您(或您的用户)执行以下操作:
1 | import packageA.sub_package_in_A as sub_package_in_A |
但它确实阻止了你允许:
1 | import sub_package_in_A |
直接。
如果您有希望在多个项目之间共享的公共代码,则可能需要考虑将此代码存储在物理上独立的项目中,然后将其作为依赖项导入到其他项目中。如果您将公共代码项目托管在GitHub或BitBucket中,那么很容易实现这一点,您可以在其中使用PIP将其安装到任何其他项目中。这种方法不仅可以帮助您轻松地在多个项目之间共享公共代码,而且还可以帮助您避免无意中创建不好的依赖项(即从公共代码指向非公共代码的依赖项)。
下面的链接提供了使用pip和virtualenv管理依赖项的良好介绍,如果您和您的团队对使用python相当陌生,那么绝对值得一读,因为这是用于此类问题的非常常见的工具链:
http://dabapps.com/blog/introduction-to-pip-and-virtualenv-python/
下面的链接显示了如何使用PIP从GitHub中拉入依赖项:
如何使用python pip安装软件,从github中提取包?
...it seems that there is an assumption that all referenced packages
are below the top-level project folder, not collateral to it.
这主要是因为默认情况下,当前工作目录是
如果删除它,甚至无法从当前工作目录导入内容…
1 2 3 4 5 6 7 8 | $ 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 |
The thought also occurred to me that perhaps the correct approach is
to develop common/framework modules in a separate project, and once
tested, deploy those to each developer's environment by installing to
the site-packages folder.
这不是一个真正的发展问题。如果您使用的是版本控制,并且所有开发人员都使用相同的结构签出源代码树,那么您可以很容易地使用相对路径黑客来确保代码正常工作,而不必乱弄环境变量或符号链接。
However, that also raises questions re distribution.
这是事情可能变得更加复杂的地方,但前提是您计划独立于使用库的项目发布库,和/或让多个项目安装程序共享相同的库。就是这样,看看distutils。
如果不是,您可以简单地使用开发中使用的相同的相对路径黑客,以确保您的项目"开箱即用"。
我认为这是创建可分发的python包的最佳参考:
链接被删除,因为它会导致黑客网站。
另外,不要认为需要将所有内容都嵌套在一个目录下。你可以做像
1 2 3 4 5 | platform/ core/ coremodule api/ apimodule |
然后做一些像