setup.py 不安装要求
setup.py don't installing the requirements
我做了一个 python 库,这是我的第一个 python 库
发表于 pypl and 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,
)
这个错误的原因是 setup.py
从包中导入。这意味着 python 将在处理 setup.py
时尝试导入库(即在安装任何依赖项之前)。
由于您只是导入包来获取版本信息,因此可以用不同的方法替换此导入。
一个简单的方法是直接在 setup.py
中包含版本信息,但这样做的缺点是版本不再是单一来源。
其他方法涉及一些工作,但允许版本信息继续单一来源。有关建议,请参阅 https://packaging.python.org/guides/single-sourcing-package-version/。该页面有一个选项列表,其中一些选项可能比其他选项更适合您的包设置。我个人更喜欢选项 3:
Set the value to a __version__
global variable in a dedicated module
in your project (e.g. version.py), then have setup.py read and exec
the value into a variable.
...
Using exec:
version = {}
with open("...sample/version.py") as fp:
exec(fp.read(), version)
# later on we use: version['__version__']
另一个选项可能是使用 versioneer 包(pandas 使用它)。
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
您还可以在包的 __init__.py
中定义版本,例如:
__version__ = "1.1.0"
然后,您可以阅读 init.py 并提取版本,而不是在您的 setup.py
中导入 __version__
。
实际上,这是官方Python指南中提出的解决方案:
https://packaging.python.org/guides/single-sourcing-package-version/
我做了一个 python 库,这是我的第一个 python 库 发表于 pypl and 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,
)
这个错误的原因是 setup.py
从包中导入。这意味着 python 将在处理 setup.py
时尝试导入库(即在安装任何依赖项之前)。
由于您只是导入包来获取版本信息,因此可以用不同的方法替换此导入。
一个简单的方法是直接在 setup.py
中包含版本信息,但这样做的缺点是版本不再是单一来源。
其他方法涉及一些工作,但允许版本信息继续单一来源。有关建议,请参阅 https://packaging.python.org/guides/single-sourcing-package-version/。该页面有一个选项列表,其中一些选项可能比其他选项更适合您的包设置。我个人更喜欢选项 3:
Set the value to a
__version__
global variable in a dedicated module in your project (e.g. version.py), then have setup.py read and exec the value into a variable....
Using exec:
version = {} with open("...sample/version.py") as fp: exec(fp.read(), version) # later on we use: version['__version__']
另一个选项可能是使用 versioneer 包(pandas 使用它)。
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
您还可以在包的 __init__.py
中定义版本,例如:
__version__ = "1.1.0"
然后,您可以阅读 init.py 并提取版本,而不是在您的 setup.py
中导入 __version__
。
实际上,这是官方Python指南中提出的解决方案:
https://packaging.python.org/guides/single-sourcing-package-version/