【问题标题】:Providing pytz version in setup.py requirements在 setup.py 要求中提供 pytz 版本
【发布时间】:2012-10-07 05:21:13
【问题描述】:

问题

我想在我的库中的setup.py 脚本中包含对pytz 的要求,但还想设置所需的最低版本。但是pytz 模块使用的版本号(例如“2012f”)似乎与distutils 想要提供的版本号不兼容(例如“1.1.3”)。

有没有办法在不更改pytzdistutils 的情况下包含对特定版本pytz(例如>=2012f)的要求?

详情

为此,我在setup.py 文件中做了类似的事情:

setup(
    # ... basic data here ...
    requires=[
        'pytz (>=2012f)',
    ],
    # ... some other data here ...
)

但是我在做sudo python setup.py install的时候,出现如下错误:

Traceback (most recent call last):
  File "setup.py", line 25, in <module>
    long_description=long_description,
  File "/usr/lib/python2.7/distutils/core.py", line 112, in setup
    _setup_distribution = dist = klass(attrs)
  File "/usr/lib/python2.7/distutils/dist.py", line 259, in __init__
    getattr(self.metadata, "set_" + key)(val)
  File "/usr/lib/python2.7/distutils/dist.py", line 1220, in set_requires
    distutils.versionpredicate.VersionPredicate(v)
  File "/usr/lib/python2.7/distutils/versionpredicate.py", line 115, in __init__
    self.pred = [splitUp(aPred) for aPred in str.split(",")]
  File "/usr/lib/python2.7/distutils/versionpredicate.py", line 25, in splitUp
    return (comp, distutils.version.StrictVersion(verStr))
  File "/usr/lib/python2.7/distutils/version.py", line 40, in __init__
    self.parse(vstring)
  File "/usr/lib/python2.7/distutils/version.py", line 107, in parse
    raise ValueError, "invalid version number '%s'" % vstring
ValueError: invalid version number '2012f'

看起来问题是由distutils 试图匹配这个正则表达式引起的:

version_re = re.compile(r'^(\d+) \. (\d+) (\. (\d+))? ([ab](\d+))?$',
                        re.VERBOSE)

如果不匹配,则会引发上述错误。

我看到有人修改pytz 的源代码(将版本更改为更像2012.6),但这对我来说似乎是个非常糟糕的主意。我希望还有另一种我错过的方式。

pytz (&gt;=2012f) 更改为pytz 可行,但它不会将要求限制为pytz 模块的特定版本。

【问题讨论】:

  • 您可以使用 setuptools/distribute 中的 install_requires='pytz &gt;= 2012f'。 distutils 忽略此选项(发出警告,您可以有条件地包含该选项)。无论如何distutils 不会安装依赖项。 pip install 使用 setuptools/distribute 所以它会自动拉取依赖。顺便说一句,不要使用sudo python setup.py install 没有卸载选项(pip 有卸载命令。也使用 virtualenv 进行安装测试)。
  • 是的,不要使用要求。有一个开放的错误可以使 Python 文档对这些未使用的字段(要求、提供和过时)发出警告。现在你必须使用第三方工具,如 pip、setuptools 或 buildout 来声明你的依赖项,未来这些工具将支持新标准(requires-dist)。
  • @ÉricAraujo:我需要以某种方式将私有模块(“moduleA”)分发给一些私有项目(假设一个叫做“projectB” )。当前的方法是在“projectB”中使用requirements.txt 文件并在其中包含类似“git+ssh://github.com/myName/moduleA”的内容,然后使用pip install -r requirements.txt 在项目中安装每个依赖项。如何确保也安装依赖项?通过将需求更改为 install_requires?或者通过使用稍微不同的方法?我会很感激关于选择什么的建议。
  • @J.F.Sebastian:你觉得我的previous comment怎么样?如果我将包含私有 Git 存储库的路径,pip install -r requirements.txt 会以当前形式处理依赖项吗?如果没有,我可以改变什么?
  • @Tadeck: install_requires 说 pip 要安装什么依赖项,而不是在哪里找到它们。有 dependency_links setuptools 选项,但 requirements.txt 可能更方便(允许从不同的地方安装相同的包,例如,stable vs. dev)。您需要链接中的#egg...

标签: python distutils setup.py pytz


【解决方案1】:

使用install_requires setuptools option

setup(
    # ... basic data here ...
    install_requires='pytz>=2012f', # distutils ignores it with a warning, pip uses it
    # ... some other data here ...
)

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2015-10-24
    • 2020-10-18
    • 2015-11-28
    • 2019-07-05
    • 1970-01-01
    • 2019-09-10
    • 2012-01-19
    相关资源
    最近更新 更多