我目前正在维护自己的两个应用程序。它们共享一些共同的方面,因此,共享一些代码。到目前为止,我刚刚将模块从一个项目复制到另一个项目,但现在它已成为一个维护问题。我宁愿在两个项目之外的一个地方使用公共代码,它们都可以导入。然后,对公共代码的任何更改都将反映在两个项目中。
我的问题是:我怎么能这样做?我是否使用此代码创建了一个库?如果是这样,依赖项目如何使用库?我认为我在这里遇到的一件事是公共代码对其他任何人都没有用,或者至少,我不想让它成为其他人可以使用的支持模块。
如果我的问题不明确,请告诉我。
答案 0 :(得分:18)
你不需要做什么特别的事情,Python只需要找到你的模块。这意味着您必须将公共模块放入PYTHONPATH
,或将其位置添加到sys.path
。 See this.
说你有
~/python/project1
~/python/project2
~/python/libs/stuff.py
~/python/libs/other.py
您可以在您的操作系统中设置PYTHONPATH='~/python/libs'
,也可以
import sys, os
sys.path.append(os.path.expanduser('~/python/libs')) # or give the full path
之后,您可以随时随地import stuff, other
。
你也可以打包你的东西,然后你需要这样的布局:
~/python/project1
~/python/project2
~/python/libs/mylibname/__init__.py
~/python/libs/mylibname/stuff.py
~/python/libs/mylibname/other.py
~/python/libs/mylibname/__init__.py
必须存在,但它可以是空文件。它会将mylibname
变为package。
如上所述将libs文件夹添加到路径后,您可以执行from mylibname import stuff, other
。
答案 1 :(得分:3)
有许多方法可以对代码进行分解,因此可以重复使用。这取决于你的具体情况,哪种方法效果最好。将代码分解为单独的包和模块总是一个好主意,因此相关代码保持捆绑在一起,可以从其他包和模块中重用。将代码分解到模块中的类中也可以帮助将相关代码组合在一起。
我想说将公共代码放入PYTHONPATH中的模块或包中并且可用于两个应用程序可能是您的最佳解决方案。
答案 2 :(得分:0)
我将如何做到这一点:
制作您共同项目的EGG档案:
~:zip common.egg common
将egg文件作为库的一部分
cp common.egg PROJECT_PATH/lib/
在您的项目中:
import glob
import os
def main():
path_lib=os.path.abspath(os.path.split(os.path.abspath(sys.modules['__main__'].__file__))[0] + '/../lib')
sys.path += glob.glob(path_lib + '/*.egg')
from common import stuff
stuff.doCommonStuff()