Python requirements.txt限制依赖项只能安装在atom处理器上

liwlm1x9  于 2023-02-07  发布在  Python
关注(0)|答案(1)|浏览(135)

我在x64_64环境下使用TensorFlow,但处理器是Intel Atom处理器。该处理器缺少AVX处理器扩展,由于TensorFlow的预构建轮盘符合AVX扩展,TensorFlow无法工作并退出。因此我必须构建自己的轮盘,并将其作为发布文件托管在GitHub上。
我遇到的问题是只能在基于Atom的处理器上下载这个预构建的wheel。我以前可以使用setup.py文件来实现这一点,在那里可以很容易地检测到这一点,但我已经迁移到pyproject.toml,这在定制和脚本安装支持方面非常糟糕。
除了检查处理器类型的platform_machine=='x86_64'之外,还有什么类似的东西吗?或者迁移到pyproject.toml是否扼杀了我的灵活性?
当前requirements.txt为:

confluent-kafka @ https://github.com/HandsFreeGadgets/python-wheels/releases/download/v0.1/confluent_kafka-1.9.2-cp38-cp38-linux_aarch64.whl ; platform_machine=='aarch64'
tensorflow @ https://github.com/HandsFreeGadgets/python-wheels/releases/download/v0.1/tensorflow-2.8.4-cp38-cp38-linux_aarch64.whl ; platform_machine=='aarch64'
tensorflow-addons @ https://github.com/HandsFreeGadgets/python-wheels/releases/download/v0.1/tensorflow_addons-0.17.1-cp38-cp38-linux_aarch64.whl ; platform_machine=='aarch64'
tensorflow-text @ https://github.com/HandsFreeGadgets/python-wheels/releases/download/v0.1/tensorflow_text-2.8.2-cp38-cp38-linux_aarch64.whl ; platform_machine=='aarch64'
rasa==3.4.2
SQLAlchemy==1.4.45
phonetics==1.0.5
de-core-news-md @ https://github.com/explosion/spacy-models/releases/download/de_core_news_md-3.4.0/de_core_news_md-3.4.0-py3-none-any.whl

对于platform_machine=='aarch64',我需要类似于x86_64的东西,但只在Atom处理器环境中执行。
旧的setup.py是:

import platform
import subprocess
import os

from setuptools import setup

def get_requirements():
    requirements = []

    if platform.machine() == 'x86_64':
        command = "cat /proc/cpuinfo"
        all_info = subprocess.check_output(command, shell=True).strip()
        # AVX extension is the missing important information
        if b'avx' not in all_info or ("NO_AVX" in os.environ and os.environ['NO_AVX']):
            requirements.append(f'tensorflow @ file://localhost/'+os.getcwd()+'/pip-wheels/amd64/tensorflow-2.3.2-cp38-cp38-linux_x86_64.whl')
    elif platform.machine() == 'aarch64':
       ...
    requirements.append('rasa==3.3.3')
    requirements.append('SQLAlchemy==1.4.45')
    requirements.append('phonetics==1.0.5')
    requirements.append('de-core-news-md @ https://github.com/explosion/spacy-models/releases/download/de_core_news_md-3.4.0/de_core_news_md-3.4.0-py3-none-any.whl')
    return requirements

setup(
    ...
    install_requires=get_requirements(),
    ...
)

直线if b'avx' not in all_info or ("NO_AVX" in os.environ and os.environ['NO_AVX'])做了必要的微分。
如果pyproject.toml方法不符合我的需求,那么对于安装能力更强且未标记为遗留的Python,建议使用什么方法?对于Python,可能有类似的方法Gradle用于在Java世界中构建项目,引入Gradle是为了克服XML限制,并提供我不知道的完整脚本语言?

8ehkhllq

8ehkhllq1#

我的建议是按照预期迁移pyproject.toml,我会根据依赖项的标准规范声明依赖项,如tensorflow,但我根本不会使用任何 * 直接引用 *。
然后我会创建一些requirements.txt文件,其中我会列出需要特殊处理的依赖项(不需要列出所有依赖项),例如那些需要 * 直接引用 *(和/或固定版本)的依赖项。我可能会为每个平台创建一个 requirements 文件,例如我会创建一个requirements-atom.txt
据我所知,应该可以通过URL指示 pip 从远程 requirements 文件进行安装。

python -m pip install --requirement 'https://server.tld/path/requirements-atom.txt'

如果您需要创建多个包含公共部分的requirements.txt文件,那么pip-tools之类的工具可能会有所帮助。
可能类似于以下内容(未经测试):
requirements-common.in

# Application (or main project)
MyApplication @ git+https://github.com//HandsFreeGadgets.git

# Common dependencies
rasa==3.4.2
SQLAlchemy==1.4.45
phonetics==1.0.5

requirements-atom.in
一个二个一个一个

相关问题