集成多个Python项目

use*_*ser 2 python

我有 2 个 Python 项目:

Proj1(/var/www/proj1)
    venv
    requirments.txt
    app
      fun.py
      fun2.py
    app2
      pdf.py
      somefun2.py


Proj2(/var/www/proj2)
    venv
    requirments.txt
    another
      anotherfun.py
      anotherfun2.py
    someanother
      someanotherfun.py
      pdfproj2.py
Run Code Online (Sandbox Code Playgroud)

两者都是独立工作的,并且都有不同的要求。

假设pdf.pyfrom有一个可以生成一些 PDF 的proj1函数。generate它将占用app/fun2同一项目中的所有其他模块(等)。

现在我想要的是这个功能(pdf.py->生成)我想pdfproj2.pyproj2.

这怎么可能?

注意:我没有使用任何框架,如 Flask/django 等

J_H*_*J_H 5

至少有三种方法。

1.外部调用

什么都不改变。差不多了。

命令行调用者已经能够利用$ python proj1/app2/pdf.py arg...、调用generate(). 安排proj2pdf.py分叉一个子进程 并执行此操作。project1 中没有任何变化,因为它的公共 API 已经支持此用例。

请注意,您可能需要仔细处理PATH&PYTHONPATH 环境变量,作为正确调用 pdf.py 命令的一部分。conda这就是和venv所擅长的那种设置。

2. 合并项目

这是一种快速而肮脏的方法。我不推荐它。

创建project3,并合并两个现有项目的源代码。取所有库依赖项的并集。

现在,您可以generate()在与调用 python 代码相同的地址空间、相同的进程中进行调用。缺点是:丑陋。较大项目的代码库不太容易维护。

3、包装

generate()供project2 或任何项目使用的“正确”方法是将其打包。假设您要在pypi上发布。是否真的这样做并不重要,让我们为这种可能性做好准备。

创建setup.py或类似的,也许使用setuptools,并创建一个项目1的轮子(或至少一个tar)。有很多方法可以做到这一点,而且最佳实践也在不断发展,因此我不会在这里深入探讨细节。

现在,您可以将project1列为project2的requirements.txt中的依赖项,import它就像任何其他dep一样。问题解决了!

这是最好的方法。它确实需要一些工作,并且学习曲线平缓。

  • 请注意,OP 已经显示了每个项目的打包设置,包括特定于项目的虚拟环境。为了使用另一个包中的一个包,需要将两个包安装在同一个虚拟环境中。 (2认同)