在我自己的包中嵌入Python库

时间:2013-09-15 12:54:08

标签: python

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

例如,取Requests library。 我怎么能将它集成到我自己的包中,目的是允许我在不同的机器上运行我的应用程序,而不是在每个机器上实际安装Requests,而是将它放在与我的包相同的文件夹中?

这甚至可能吗?

4 个答案:

答案 0 :(得分:30)

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

|- application.py
|- lib
|  `- ...
|- docs
|  `- ...
`- vendor
   |- requests
   |  |- __init__.py
   |  `- ...
   `- other libraries...

此示例中的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

答案 1 :(得分:4)

如果您只需要运行您的应用程序,pyinstaller包装是更好的选择。

它将创建一个包含所需内容的捆绑包,包括Python,以避免依赖于您正在运行的系统。

答案 2 :(得分: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

也会自动安装请求。

答案 3 :(得分:0)

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

您可以参考以下链接: https://packaging.python.org/tutorials/packaging-projects/