当前位置: 代码迷 >> python >> 如何为我用于多个不同项目的模块创建本地 Python 包
  详细解决方案

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

热度:42   发布时间:2023-06-13 16:47:48.0

我编写了几组实用函数来分析科学数据。 例如,为了制作绘图,我可能有一个名为plotting_tools.py的文件

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

from plotting_tools.py import * 

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

然而,这种方法有一定的局限性,因为当我在发现一个bug 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 存储库用于我的所有功能,还是有办法完全在本地执行此操作?

您可以使用创建本地库。

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

python setup.py 安装

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

pip安装包

但这将是本地的。

这是您可以定义的 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 安装

在此之后,您可以在其他脚本中执行此操作。

from polotting_lib import *

def foo(*args):
    some_method_from_plotting_lib(args)

希望这可以帮助。