我有 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.py在proj2.
这怎么可能?
注意:我没有使用任何框架,如 Flask/django 等
至少有三种方法。
什么都不改变。差不多了。
命令行调用者已经能够利用$ python proj1/app2/pdf.py arg...、调用generate(). 安排proj2pdf.py分叉一个子进程
并执行此操作。project1 中没有任何变化,因为它的公共 API 已经支持此用例。
请注意,您可能需要仔细处理PATH&PYTHONPATH
环境变量,作为正确调用 pdf.py 命令的一部分。conda这就是和venv所擅长的那种设置。
这是一种快速而肮脏的方法。我不推荐它。
创建project3,并合并两个现有项目的源代码。取所有库依赖项的并集。
现在,您可以generate()在与调用 python 代码相同的地址空间、相同的进程中进行调用。缺点是:丑陋。较大项目的代码库不太容易维护。
generate()供project2 或任何项目使用的“正确”方法是将其打包。假设您要在pypi上发布。是否真的这样做并不重要,让我们为这种可能性做好准备。
创建setup.py或类似的,也许使用setuptools,并创建一个项目1的轮子(或至少一个tar)。有很多方法可以做到这一点,而且最佳实践也在不断发展,因此我不会在这里深入探讨细节。
现在,您可以将project1列为project2的requirements.txt中的依赖项,import它就像任何其他dep一样。问题解决了!
这是最好的方法。它确实需要一些工作,并且学习曲线平缓。