PyPI 包装:install_requires`pillow`
PyPI Packaging: install_requires `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
,因为我在 setup.py
中写了 install_requires
的值(也在 requirements.txt
中):
# setup.py
from setuptools import setup, find_packages
...
setup(
name='Identicon',
version=Identicon.__version__,
...
install_requires=[
'pillow',
],
)
# requirements.txt
pillow
我怎样才能使我的项目依赖于 pillow
?
我认为您的问题源于此:
version=Identicon.__version__,
为此,您要导入 Identicon
,这是您的包,它会导入 PIL
。所以,你的 setup.py
坏了。它需要已经安装依赖项才能执行,但是 setup.py
首先安装这些依赖项是一项工作。
这是包装中常见的"chicken and egg"情况。解决方案是使用不同的方式从包中解析版本号,或者将版本号存储在不会触发依赖项导入的地方。
您可以使用 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,
…
)
我在上传之前在包目录中使用 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
,因为我在 setup.py
中写了 install_requires
的值(也在 requirements.txt
中):
# setup.py
from setuptools import setup, find_packages
...
setup(
name='Identicon',
version=Identicon.__version__,
...
install_requires=[
'pillow',
],
)
# requirements.txt
pillow
我怎样才能使我的项目依赖于 pillow
?
我认为您的问题源于此:
version=Identicon.__version__,
为此,您要导入 Identicon
,这是您的包,它会导入 PIL
。所以,你的 setup.py
坏了。它需要已经安装依赖项才能执行,但是 setup.py
首先安装这些依赖项是一项工作。
这是包装中常见的"chicken and egg"情况。解决方案是使用不同的方式从包中解析版本号,或者将版本号存储在不会触发依赖项导入的地方。
您可以使用 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,
…
)