1. ホーム
  2. python

[解決済み] Pythonアプリケーションで、プラットフォームに応じて条件付きでrequirements.txtファイルを作成する方法はありますか?

2023-04-06 03:58:19

質問

LinuxとWindowsの両プラットフォームに対応するように書いたPythonのアプリケーションがあります。しかし、1つの問題があります... 私がWindowsのために必要とするpythonパッケージの1つは、Linuxと互換性がありません。幸いなことに、Linuxで同じ機能を提供する別のパッケージがあります。他のすべての依存関係は、両方のプラットフォームで互換性があります。

私は、両方のプラットフォームの依存関係を別々に扱うために、2 つの別々の要件ファイルを持つことができることを知っています。win_requirements.txt と linux_requirements.txt のようなものですが、この方法は最適な方法とは思えません。

requirements.txt を 1 つだけにして、どのユーザーでも pip install -r requirements.txt を使用して、プラットフォームに関係なく、すべての依存関係をインストールできるようにする方法はないでしょうか?

のようなものでしょうか?

SOAPpy>=0.12.22
pycrypto>=2.6.1
suds>=0.4
Python-ldap>=2.4.19
paramiko>=1.15.2
nose>=1.3.4
selenium>=2.44.0
bottle>=0.12.8
CherryPy>=3.6.0
pika>=0.9.14
if platform.system() == 'Linux':
    wmi-client-wrapper>=0.0.12
else if platform.system() == 'Windows':
    WMI>=1.4.9

どのように解決するのですか?

この場合 install.py スクリプトを作成し pip をスクリプトで呼び出す。

import pip

_all_ = [
    "SOAPpy>=0.12.22",
    "pycrypto>=2.6.1",
    "suds>=0.4",
    "Python-ldap>=2.4.19",
    "paramiko>=1.15.2",
    "nose>=1.3.4",
    "selenium>=2.44.0",
    "bottle>=0.12.8",
    "CherryPy>=3.6.0",
    "pika>=0.9.14",
]

windows = ["wmi-client-wrapper>=0.0.12",]

linux = ["WMI>=1.4.9",]

darwin = []

def install(packages):
    for package in packages:
        pip.main(['install', package])

if __name__ == '__main__':

    from sys import platform

    install(_all_) 
    if platform == 'windows':
        install(windows)
    if platform.startswith('linux'):
        install(linux)
    if platform == 'darwin': # MacOS
        install(darwin)

この問題を解決する別の方法として requirements ファイルを使用する別の方法は requirements

要件.txt

SOAPpy>=0.12.22
pycrypto>=2.6.1
suds>=0.4
Python-ldap>=2.4.19
paramiko>=1.15.2
nose>=1.3.4
selenium>=2.44.0
bottle>=0.12.8
CherryPy>=3.6.0

windows.txt

-r requirements.txt
WMI>=1.4.9

linux.txt

-r requirements.txt
WMI>=1.4.9

そうすると、プラットフォームに相当する要件だけを呼び出すことができます。

pip install -r windows.txt
pip install -r linux.txt