33

如何在我自己的 Python 包中“嵌入”一个 Python 库?

Requests 库为例。我如何将它集成到我自己的包中,目标是允许我在不同的机器上运行我的应用程序,而无需在每一台机器上实际安装 Requests,而是将它与我​​的包放在同一个文件夹中?

这甚至可能吗?

4

4 回答 4

37

如果它是一个纯 python 库(没有编译模块),您可以简单地将库放在项目中的文件夹中,然后将该文件夹添加到模块搜索路径中。这是一个示例项目:

|- 应用程序.py
|- 库
| `- ...
|- 文档
| `- ...
`- 供应商
   |- 请求
   | |- __init__.py
   | `- ...
   `- 其他库...

此示例中的vendor文件夹包含所有第三方模块。该文件application.py将包含以下内容:

import os
import sys

# Add vendor directory to module search path
parent_dir = os.path.abspath(os.path.dirname(__file__))
vendor_dir = os.path.join(parent_dir, 'vendor')

sys.path.append(vendor_dir)

# Now you can import any library located in the "vendor" folder!
import requests

奖金事实

正如seeafish在评论中指出的那样,您可以将软件包直接安装到供应商目录中:

pip install <pkg_name> -t /path/to/vendor_dir
于 2013-09-15T13:11:37.093 回答
4

如果你只需要运行你的应用程序可能pyinstaller打包是一个更好的选择。

它将创建一个包含所有需要的包,包括 Python,以避免对您正在运行的系统的依赖。

于 2013-09-15T13:12:06.047 回答
2

虽然不是直接回答您的问题。你可能想看看setuptools。通过利用这种包分发机制,您可以描述您的依赖关系,并且当您的包被“安装”时,所有依赖包也将被安装。您将在包结构的顶部创建一个setup.py文件,类似于:

from setuptools import setup, find_packages

setup(
    name = 'MyPackage',
    version = '1.0',
    packages = find_packages(),
    ...
    install_requires = ['requests'],
    ...
)

这将由用户安装

python setup.py install

请求也会自动安装。

于 2013-09-15T13:59:17.723 回答
0

以上所有答案都是正确的,但最好的解决方案是创建一个标准包。

你可以参考这个链接: https ://packaging.python.org/tutorials/packaging-projects/

于 2018-11-25T21:16:48.270 回答