【问题标题】:PyPI Packaging: install_requires `pillow`PyPI 打包: install_requires `pillow`
【发布时间】:2018-02-06 17:59:43
【问题描述】:

在上传之前,我在包目录中使用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 对吗?

【问题讨论】:

    标签: python pip setuptools pillow


    【解决方案1】:

    我认为您的问题源于此:

    version=Identicon.__version__,
    

    为此,您要导入 Identicon,这是您的包,它会导入 PIL。所以,你的setup.py 坏了。它需要已经安装依赖项才能执行,但是首先安装这些依赖项是setup.py 工作。

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

    【讨论】:

    • 知道了。但我指的是howdoi's setup.py。这怎么可能?这没有意义。
    • Look at their __init__.py file它不会触发依赖项的导入。但是在您的__init__.py 文件中,您可以(我可以在回溯中看到)。
    • 是的,在我的 __init__.py 工作中删除 import Identicon。它解决了这个问题,但仍然在设计项目结构..? 谢谢!
    【解决方案2】:

    您可以使用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,
          …
         )
    

    【讨论】:

    • imp 自 3.4 版起已弃用
    • 在 3.4、3.5 和 3.6 中完美运行。 ;-)
    • 有更好的方法来隔离不需要这些黑客攻击的版本号。
    • 如果这些方法真的更好,那就是基于意见的! ;-)
    猜你喜欢
    • 2021-09-05
    • 2018-03-03
    • 2012-01-07
    • 2019-10-26
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2018-07-04
    • 2012-12-04
    相关资源
    最近更新 更多