首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Pipfile中指定平台特定的附加程序或版本?

如何在Pipfile中指定平台特定的附加程序或版本?
EN

Stack Overflow用户
提问于 2021-06-23 15:14:13
回答 1查看 3K关注 0票数 10

在“基本上指定任何内容”一节中,“Pipenv的高级使用”文档解释了如何在Pipfile中有条件地在os平台上包含包要求,例如:

代码语言:javascript
复制
pywinusb = {version = "*", sys_platform = "== 'win32'"}

当您想要为一个包指定不同的版本或选项时,还不清楚该如何做,这取决于平台。

具体来说,我有这样的要求:

代码语言:javascript
复制
faust = {version=">=1.10.1", extras=["aiodns", "ciso8601", "cython"]}

我想排除Windows中可选的额外ciso8601

如果我写

代码语言:javascript
复制
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部分)中使用相同的内容。

EN

回答 1

Stack Overflow用户

发布于 2021-06-27 02:53:14

工作答案- 06-30-2021 @15:43协调世界时

我多次查看浮士德存储库,发现aiodns、cython和ciso8601本身不是依赖项,而是捆绑包,根据ReadMe,这些包是以这种方式安装的:

代码语言:javascript
复制
pip install "faust[aiodns, ciso8601, cython]"

我用您的需求创建了一个setup.py。我能够在一个非windows系统上安装faust和包aiodns、ciso8601、cython。我没有一个windows系统来测试安装,但我确实翻转了系统平台参数,这是有效的。

代码语言:javascript
复制
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下载

代码语言:javascript
复制
[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包,它显示了“附加”参数与包的核心依赖关系进行网格化。

代码语言:javascript
复制
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包中的依赖项要求。

代码语言:javascript
复制
[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文档中不允许重复键。

例如:

代码语言:javascript
复制
faust = {version=">=1.10.1", extras=["aiodns", "ciso8601", "cython"], platform_system = "!= 'Windows'"}

faust = {version=">=1.10.1", extras=["aiodns", "cython"], platform_system = "== 'Windows'"}

参考琵琶的源代码

代码语言:javascript
复制
# 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存储库上进行了讨论。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68102588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档