Requirement.txt tergantung pada versi python

91

Saya mencoba mem-port paket python2 ke python3 (bukan milik saya) menggunakan enam sehingga kompatibel dengan keduanya. Namun salah satu paket yang terdaftar di requirement.txt sekarang disertakan dalam python3 stdlib dan versi pypi tidak berfungsi di python3 jadi saya ingin mengecualikannya secara bersyarat. Melakukan ini di setup.py mudah, saya bisa melakukan sesuatu seperti:

if sys.version_info[0] == 2:
    requirements += py2_requirements
else:
    requirements += py3_requirements

Tapi saya ingin Requirement.txt mencerminkan daftar yang benar juga. Saya tidak dapat menemukan apa pun tentang ini di dokumentasi pip. jadi apakah ada yang tahu bagaimana melakukannya, atau apakah itu mungkin?

aquavitae
sumber
1
Harap ubah tanggapan yang diterima ke stackoverflow.com/a/33451105/99834 - yang tidak diragukan lagi merupakan cara yang tepat untuk menerapkan ini.
sorin

Jawaban:

140

Anda dapat menggunakan penanda lingkungan untuk mencapai ini requirements.txtsejak pip 6.0:

SomeProject==5.4; python_version < '2.7'
SomeProject; sys_platform == 'win32'

Ini juga didukung oleh setuptools dengan mendeklarasikan persyaratan tambahan di setup.py:

setup(
    ...
    install_requires=[
        'six',
        'humanize',
    ],
    extras_require={
        ':python_version == "2.7"': [
            'ipaddress',
        ],
    },
)

Lihat juga penentu persyaratan . Dan Strings untuk versi string dari perintah Python yang sesuai.

Jiangge Zhang
sumber
Bagus! Bagaimana saya bisa melakukan hal yang sama sys.platform == "win32"? Saya mencoba menggunakan :sys.platform == "win32", tetapi saya mendapatkan kesalahan "Penanda lingkungan tidak valid" dari setup()fungsi
André Caron
3
Pembaruan: PEP 496 - Penanda Lingkungan telah digantikan oleh PEP 508 - Spesifikasi ketergantungan untuk Paket Perangkat Lunak Python , yang sepenuhnya menentukan sintaks deklarasi ketergantungan termasuk sintaksis untuk penanda lingkungan .
jkdev
11

Anda dapat membuat beberapa file persyaratan, meletakkan paket umum tersebut di file umum, dan memasukkannya ke dalam file persyaratan pip lain dengan -r file_path

requirements/
  base.txt
  python2.txt
  python3.txt

python2.txt:

-r base.txt
Django==1.4 #python2 only packages

python3.txt:

-r base.txt
Django==1.5 #python3 only packages

pip install -r persyaratan / python2.txt

Leonardo.Z
sumber