在“基本上指定任何内容”一节中,“Pipenv的高级使用”文档解释了如何在Pipfile中有条件地在os平台上包含包要求,例如:
pywinusb = {version = "*", sys_platform = "== 'win32'"}当您想要为一个包指定不同的版本或选项时,还不清楚该如何做,这取决于平台。
具体来说,我有这样的要求:
faust = {version=">=1.10.1", extras=["aiodns", "ciso8601", "cython"]}我想排除Windows中可选的额外ciso8601。
如果我写
faust = {version=">=1.10.1", extras=["aiodns", "ciso8601", "cython"], platform_system = "!= 'Windows'"}
faust = {version=">=1.10.1", extras=["aiodns", "cython"], platform_system = "== 'Windows'"}我得到了错误:tomlkit.exceptions.KeyAlreadyPresent: Key "faust " already exists.
此外,我还想在setup.py (install_requires部分)中使用相同的内容。
发布于 2021-06-27 02:53:14
工作答案- 06-30-2021 @15:43协调世界时
我多次查看浮士德存储库,发现aiodns、cython和ciso8601本身不是依赖项,而是捆绑包,根据ReadMe,这些包是以这种方式安装的:
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包,以及在我的MacBook上安装的附加软件包aiodns、ciso8601和cython。

在查看了PipeEnv文档之后(这是不直观的),您似乎可以在pipfile中执行以下操作。我所查看的每个引用都要求您为辅助密钥指定一个文件路径,在此原因中是faust_win。在faust_win中调用的文件来自浮士德PyPi下载。
[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。如果我在我的项目__init__.py中创建了一个faust_pipenv_test,它会自动为我的项目触发一个依赖项安装。还安装了Faust 标准依赖需求,以及附加的程序包aiodns、ciso8601和cython。

我还收到一条消息,说faust_win需求没有安装,因为它不符合这个要求,sys_platform =='win32'。

更新06-28-2021 @12:23世界协调时
当我查看faust的源代码时,我注意到包aiodns、cython和ciso8601是faust的setup.py文件中的依赖项。
因此,根据您的问题,您似乎不希望在非windows系统上安装ciso8601的faust默认依赖项。而且,基于附加列表,您似乎也试图限制其他依赖项。
,这就是你想要完成的吗?
Python‘states声明“附加”参数用于安装额外的依赖项,这是除了正在安装的Python包的常规依赖项之外的附加依赖项。
参考资料:PEP 426 -- Python软件包2.0的元数据
下面的代码来自于PipeEnv包,它显示了“附加”参数与包的核心依赖关系进行网格化。
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因此,下面的示例需要测试,因为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'"}原职位06-26-2021
TOML文档中不允许重复键。
例如:
faust = {version=">=1.10.1", extras=["aiodns", "ciso8601", "cython"], platform_system = "!= 'Windows'"}
faust = {version=">=1.10.1", extras=["aiodns", "cython"], platform_system = "== 'Windows'"}参考琵琶的源代码
# 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存储库上进行了讨论。
https://stackoverflow.com/questions/68102588
复制相似问题