setuptools.setup() install_requires 没有安装列出的包
setuptools.setup() install_requires not installing listed packages
我正在使用:
python 3.7.4
setuptools 50.3.0
pip 20.2.3
我有一个 public github 存储库,我正试图将其转换为要安装的包。它需要 requests
才能正常工作。
相关文件整理如下:
package
__init__.py
__version__.py
functions.py
setup.py
这在每个文件中:
# __init__.py
from .functions import first_function, second_function
# __version__.py
# version, title, etc. are defined here
__requests__ = 'requests>=2,<3'
# setup.py
import setuptools
from package.__version__ import __requests__, ...
setuptools.setup(
...,
install_requires=[__requests__]
)
当我尝试使用 pip install git+https://github.com/<user>/<repository name>.git@<version tag>
安装时,我得到一个 ModuleNotFoundError: No module named 'requests'
。
我已经查看了几个流行的 github 存储库(如 requests
和 pandas
)、github 上的 pypa 示例项目、setuptools
,以及许多 github 问题和 Whosebug 问题,但我仍然无法弄清楚我在这里做错了什么。
在 setup.py
期间导入您的代码将失败,因为您的依赖项不会被安装(基本上您已经创建了一个循环 setup.py instal_requires
-> 您的代码 -> 需要安装的请求)
有 ~2 种方法可以解决这个问题
一种是在运行时使用 importlib.metadata
读取您的依赖项(这是我的建议!)
if sys.version_info >= (3, 8):
import importlib.metadata as importlib_metadata
else:
import importlib_metadata # pip install importlib-metadata backport
dist = importlib_metadata.distribution('yourpackage')
# this is a list for example
# >>> importlib.metadata.distribution('pre-commit').requires
# ['cfgv>=2.0.0', 'identify>=1.0.0', 'nodeenv>=0.11.1', 'pyyaml>=5.1', 'toml', 'virtualenv>=20.0.8', 'importlib-resources; python_version < "3.7"', 'importlib-metadata; python_version < "3.8"']
__requests__, = [req for req in dist.requires if req.startswith('requests>=')]
另一种选择是读取您的 __init__.py
而不是导入它并手动解析它:
例如:
import ast
with open('myproject/__init__.py', encoding='UTF-8') as f:
for line in f:
if line.startswith('__requests__ ='):
requests_version = ast.literal_eval(line.split('=')[1])
break
else:
raise AssertionError(f'__requests__ = not found in {f.name}')
我个人建议前者,尽管出于各种原因我看到了两种方法
我正在使用:
python 3.7.4
setuptools 50.3.0
pip 20.2.3
我有一个 public github 存储库,我正试图将其转换为要安装的包。它需要 requests
才能正常工作。
相关文件整理如下:
package
__init__.py
__version__.py
functions.py
setup.py
这在每个文件中:
# __init__.py
from .functions import first_function, second_function
# __version__.py
# version, title, etc. are defined here
__requests__ = 'requests>=2,<3'
# setup.py
import setuptools
from package.__version__ import __requests__, ...
setuptools.setup(
...,
install_requires=[__requests__]
)
当我尝试使用 pip install git+https://github.com/<user>/<repository name>.git@<version tag>
安装时,我得到一个 ModuleNotFoundError: No module named 'requests'
。
我已经查看了几个流行的 github 存储库(如 requests
和 pandas
)、github 上的 pypa 示例项目、setuptools
,以及许多 github 问题和 Whosebug 问题,但我仍然无法弄清楚我在这里做错了什么。
在 setup.py
期间导入您的代码将失败,因为您的依赖项不会被安装(基本上您已经创建了一个循环 setup.py instal_requires
-> 您的代码 -> 需要安装的请求)
有 ~2 种方法可以解决这个问题
一种是在运行时使用 importlib.metadata
读取您的依赖项(这是我的建议!)
if sys.version_info >= (3, 8):
import importlib.metadata as importlib_metadata
else:
import importlib_metadata # pip install importlib-metadata backport
dist = importlib_metadata.distribution('yourpackage')
# this is a list for example
# >>> importlib.metadata.distribution('pre-commit').requires
# ['cfgv>=2.0.0', 'identify>=1.0.0', 'nodeenv>=0.11.1', 'pyyaml>=5.1', 'toml', 'virtualenv>=20.0.8', 'importlib-resources; python_version < "3.7"', 'importlib-metadata; python_version < "3.8"']
__requests__, = [req for req in dist.requires if req.startswith('requests>=')]
另一种选择是读取您的 __init__.py
而不是导入它并手动解析它:
例如:
import ast
with open('myproject/__init__.py', encoding='UTF-8') as f:
for line in f:
if line.startswith('__requests__ ='):
requests_version = ast.literal_eval(line.split('=')[1])
break
else:
raise AssertionError(f'__requests__ = not found in {f.name}')
我个人建议前者,尽管出于各种原因我看到了两种方法