如何为我用于多个不同项目的模块创建本地Python包

时间:2017-02-13 22:00:09

标签: python version-control packages

我有几套实用功能,我用它来分析科学数据。例如,为了制作图表,我可能会有一个名为plotting_tools.py

的文件

对于几个不同主目录和虚拟环境中的几个不同项目,我可能想要使用plotting_tools.py中的函数。一种方法是在每个项目目录中都有plotting_tools.py的副本,并且然后运行

from plotting_tools.py import * 

位于我工作流程的顶部(例如,在Jupyter笔记本中)。

但是,这种方法有局限性,因为当我发现plotting_tools.py中的错误时,我必须手动更新每个本地副本。另一种选择是在我的计算机上有一个目录,我使用importlib

从中导入模块
from importlib.machinery import SourceFileLoader

foo = SourceFileLoader("plotting_tools","/Users/me/plotting_tools.py").load_module()
from plotting_tools.py import *

这有点脆弱,因为它有一个硬编码目录,autoreload()等工具会中断。

我很好奇是否有办法更优雅地处理这个问题,我有一些本地目录,其中包含所有可以作为一个包处理的实用程序函数文件(例如,当我创建一个新的项目和虚拟环境我可以将当​​前版本的plotting_tools安装到该环境中,然后在主版本更改时手动更新它。最好的方法就是为我的所有函数使用GitHub存储库,还是有办法在本地完成这个?

1 个答案:

答案 0 :(得分:2)

您可以使用distutils创建本地库。

您可以创建一个setup.py并在那里定义您的库结构。 那么你可以做到

  

python setup.py install

它将使用您定义的包结构将库安装到您的系统或virtualenv,然后您可以从其他项目中的该包导入。 这与做

类似
  

pip install package

但这将是本地的。

这是您可以定义的setup.py示例。

假设您已将实用程序项目定义为utils

from distutils.core import setup
from utils.version import __version__

setup(
    name='utils',
    version=__version__,
    description='utility library',
    author='Asav Patel',
    author_email='',
    requires=['tornado',
              'sqlalchemy', ],
    py_modules=['config'],
    install_requires=[ 'psutil'
                    ],
    packages=['utils',
              'polotting_lib', 'polotting_lib.graph', 'polotting_lib.maps',
              'other_packages'],
    package_data={
        'polotting_lib': ['*'],
    },
)

然后就这样做

  

python setup.py install

在其他脚本中执行此操作后即可。

from polotting_lib import *

def foo(*args):
    some_method_from_plotting_lib(args)

希望这会有所帮助。