PyPI包装:install_requires`address`

时间:2018-02-06 17:59:43

标签: python pip setuptools pillow

我在上传前使用pip3 install -e .在包目录中测试我的PyPI包。

这取决于pillow(代码中导入PIL)。

当我使用已安装的枕头进行测试时,它可以正常工作。

但是,我卸载pillow然后使用pip3 install -e .重新安装我的软件包,它不起作用:

Obtaining file:///Users/hongbook/dev/identicon
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/Users/hongbook/dev/identicon/setup.py", line 4, in <module>
        import Identicon
      File "/Users/hongbook/dev/identicon/Identicon/__init__.py", line 2, in <module>
        from .Identicon import render
      File "/Users/hongbook/dev/identicon/Identicon/Identicon.py", line 5, in <module>
        from PIL import Image, ImageDraw
    ModuleNotFoundError: No module named 'PIL'

我预计当我安装时,pillow应该安装,因为我在install_requires中写了setup.py的值(也在requirements.txt中):

# setup.py
from setuptools import setup, find_packages

...

setup(
    name='Identicon',
    version=Identicon.__version__,
    ...
    install_requires=[
        'pillow',  
    ],
)

# requirements.txt
pillow

如何将我的项目依赖于pillow

2 个答案:

答案 0 :(得分:1)

我认为你的问题源于此:

version=Identicon.__version__,

为了做到这一点,您要导入Identicon,这是您的包,导入PIL。所以,你的setup.py已经破了。它需要已经安装依赖项才能执行,但是首先安装这些依赖项的setup.py作业。

这是包装中常见的“鸡蛋和鸡蛋”情况。解决方案是使用不同的方法来解析程序包中的版本号,或者将版本号存储在不会触发依赖项导入的地方。

答案 1 :(得分:0)

您可以使用imp导入版本而无需导入整个包。请参阅SQLObject

中的操作方法
from imp import load_source
from os.path import abspath, dirname, join

versionpath = join(abspath(dirname(__file__)), "sqlobject", "__version__.py")
sqlobject_version = load_source("sqlobject_version", versionpath)

setup(name="SQLObject",
      version=sqlobject_version.version,
      …
     )