工作答案 - 06-30-2021 @15:43 UTC
我多次查看 faust 存储库,发现 aiodns、cython 和 ciso8601 不是依赖项本质上,但是是捆绑包,根据自述文件以这种方式使用 pip 安装:
pip install "faust[aiodns, ciso8601, cython]"
我根据您的要求创建了一个 setup.py。我能够在非 Windows 系统上安装 faust 和包 aiodns、ciso8601、cython。我没有 Windows 系统来测试该安装,但我确实翻转了系统平台参数,这很有效。
import setuptools
setuptools.setup(
name="faust_pip_test", # change for your package
version="1.0.0", # change for your package
python_requires='>=3.6',
install_requires=["faust[aiodns, ciso8601,cython]>=1.10.1;sys_platform != 'win32'",
"faust[aiodns, cython]>=1.10.1;sys_platform == 'win32'",]
)
这里是与 faust 一起安装的 faust_pip_test 包以及附加的包 aiodns、ciso8601 和 >cython 在我的 MacBook 上。
查看 PipeEnv 文档后,这并不直观,您似乎可以在您的 pipfile 中执行以下操作。我查看的每个参考资料都要求您为辅助键指定一个文件路径,这就是 faust_win。 faust_win 中调用的文件来自faust PyPi downloads。
[packages]
faust = {version = ">=1.10.1",extras = ["aiodns", "ciso8601", "cython"],sys_platform = "!='windows'"}
faust_win = {file = 'https://files.pythonhosted.org/packages/79/f8/3fec4f5c3e5bf1ce8bb557ae507525253fa30a5cfc5984f342b931143f75/faust-1.10.4-py2.py3-none-any.whl',version = ">=1.10.1",extras = ["aiodns", "cython"],sys_platform = "=='windows'"}
我将 PyCharm 用于我的开发环境。如果我在我的项目 faust_pipenv_test 中创建__init__.py,它会自动触发我的项目的依赖项安装。 Faust standard dependencies requirements 已安装以及附加软件包 aiodns、ciso8601 和 cython。
我还收到一条消息,说 faust_win 要求没有安装,因为它不满足这个要求sys_platform =='win32'。
更新 06-28-2021 @12:23 UTC
当我查看 faust 的源代码时,我注意到包
aiodns、cython 和 ciso8601 是 faust 的 setup.py 文件中的依赖项。
因此,根据您的问题,您似乎不想安装
faust ciso8601 在非 Windows 系统上的默认依赖。根据 extras 列表,您似乎也在尝试限制其他依赖项。
这是您想要完成的任务吗?
Python 开发者指南 声明 "extras" 参数用于安装额外的依赖项,这些是常规依赖项的补充正在安装的 Python 包。
参考:PEP 426 -- Metadata for Python Software Packages 2.0
以下代码来自 PipeEnv Python 包,它表明 "extras" 参数与包的核心依赖项相结合。
def dependencies(self):
# type: () -> Tuple[Dict[S, PackagingRequirement], List[Union[S, PackagingRequirement]], List[S]]
build_deps = [] # type: List[Union[S, PackagingRequirement]]
setup_deps = [] # type: List[S]
deps = {} # type: Dict[S, PackagingRequirement]
if self.setup_info:
setup_info = self.setup_info.as_dict()
deps.update(setup_info.get("requires", {}))
setup_deps.extend(setup_info.get("setup_requires", []))
build_deps.extend(setup_info.get("build_requires", []))
if self.extras and self.setup_info.extras:
for dep in self.extras:
if dep not in self.setup_info.extras:
continue
extras_list = self.setup_info.extras.get(dep, []) # type: ignore
for req_instance in extras_list: # type: ignore
deps[req_instance.key] = req_instance
if self.pyproject_requires:
build_deps.extend(list(self.pyproject_requires))
setup_deps = list(set(setup_deps))
build_deps = list(set(build_deps))
return deps, setup_deps, build_deps
所以下面的示例需要测试,因为在Advanced Usage of Pipenv 文档中并不清楚是否可以覆盖来自第三方 Python 包的依赖项要求。
[packages]
faust = {version= ">=1.10.1", extras=["aiodns", "cython"]}
ciso8601 = {version = ">=2.1.0", sys_platform = "!= 'Windows'", index="pypi"}
or
[packages]
faust = {version=">=1.10.1", extras=["aiodns", "ciso8601", "cython"], sys_platform= "!= 'Windows'"}
"faust_win" = {version=">=1.10.1", extras=["aiodns", "cython"], sys_platform = "== 'Windows'"}
2021 年 6 月 26 日原帖
TOML 文档中不允许有重复的键。
例如:
faust = {version=">=1.10.1", extras=["aiodns", "ciso8601", "cython"], platform_system = "!= 'Windows'"}
faust = {version=">=1.10.1", extras=["aiodns", "cython"], platform_system = "== 'Windows'"}
参考pipenv的源码
# file: /pipenv/vendor/tomlkit/exceptions.py
# which is referenced from here /pipenv/vendor/tomlkit/container.py
class KeyAlreadyPresent(TOMLKitError):
"""
An already present key was used.
"""
def __init__(self, key):
message = 'Key "{}" already exists.'.format(key)
super(KeyAlreadyPresent, self).__init__(message)
此外,重复密钥问题已在 TOML Github 存储库中讨论。