【问题标题】:setup.py don't installing the requirementssetup.py 不安装要求
【发布时间】:2019-02-10 22:45:28
【问题描述】:

我做了一个 python 库,这是我的第一个 python 库 发表于pypl和github

该库运行良好,但 setup() 不行。

当我通过pip install 安装它时,它会下载appfly 包但不安装要求:Flask,flask_cors, Flask-SocketIO and jsonmerge。所以我需要自己安装。 如果我自己安装依赖项,效果很好,但我认为这是使用 python 库的错误方式吗?

这是我的setup.py 文件,我做错了什么?

from setuptools import setup, find_packages
from appfly import __version__ as version

with open('README.md') as readme_file:
    readme = readme_file.read()

# with open('HISTORY.md') as history_file:
#     history = history_file.read()

requirements = [
    'Flask==1.0.2',
    'flask_cors==3.0.6', 
    'Flask-SocketIO==3.0.2',
    'jsonmerge==1.5.2'
]

setup(
    author="Italo José G. de Oliveira",
    author_email='italo.i@live.com',
    classifiers=[
        'Natural Language :: English',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
        'Programming Language :: Python :: 3.7',
    ],
    description="This pkg encapsulate the base flask server configurations",
    install_requires=requirements,
    license="MIT license",
    long_description=readme,
    include_package_data=True,
    keywords='appfly',
    name='appfly',
    packages=find_packages(),
    url='https://github.com/italojs/appfly',
    version=version,
    zip_safe=False,
)

【问题讨论】:

标签: python python-3.x setup.py


【解决方案1】:

这个错误的原因是 setup.py 从包中导入。这意味着 python 将在处理 setup.py 时尝试导入库(即在安装任何依赖项之前)。

由于您只是导入包来获取版本信息,因此可以用不同的方法替换此导入。

一个简单的方法是直接在setup.py 中包含版本信息,但这样做的缺点是版本不再是单一来源的。

其他方法涉及一些工作,但允许版本信息继续单一来源。有关建议,请参阅https://packaging.python.org/guides/single-sourcing-package-version/。该页面有一个选项列表,其中一些可能比其他选项更适合您的包设置。我个人更喜欢选项3:

将值设置为专用模块中的__version__ 全局变量 在您的项目中(例如 version.py),然后读取并执行 setup.py 将值转换为变量。

...

使用执行:

version = {}
with open("...sample/version.py") as fp:
    exec(fp.read(), version)
# later on we use: version['__version__']

【讨论】:

    【解决方案2】:

    您还可以在包的__init__.py 中定义版本,例如:

    __version__ = "1.1.0"
    

    然后,您可以阅读 init.py 并提取版本,而不是在 setup.py 中导入 __version__。

    其实这是Python官方指南中提出的解决方案:

    https://packaging.python.org/guides/single-sourcing-package-version/

    【讨论】:

      【解决方案3】:

      另一种选择是使用 versioneer 包(熊猫使用它)。

      versioneer 使用 Git 标签创建版本值。

      步骤

      步骤 0:使用 git 标签

      Versioneer 使用你的 Git 标签。

      第 1 步:安装 versioneer

      pip install versionner
      

      第 2 步:执行 versioneer

      versioneer install
      

      第 3 步:按照版本制定者的说明进行操作

      Versioneer 会要求您对 setup.py 和 setup.cfg 进行一些更改。\

      在 setup.py 中,您必须添加如下内容:

      import versioneer
      
      setup(
          version=versioneer.get_version(),
          cmdclass=versioneer.get_cmdclass()
      )
      

      在 setup.cfg 中:

      [versioneer]
      VCS = git
      style = pep440
      versionfile_source = your_project_name/_version.py
      versionfile_build = your_project_name/_version.py
      tag_prefix = v
      parentdir_prefix = 
      

      注意:在示例中我设置了“tag_prefix = v”,因为我喜欢这样的标记:v0.1.0、v1.0.0 等等

      然后,尝试:

      python setup.py version
      

      【讨论】:

      • 请您详细说明使用versioneer 将如何工作?
      • 请详细说明可以做什么:D
      猜你喜欢
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 2022-01-15
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2014-06-06
      相关资源
      最近更新 更多