430 Stimmen

Referenz requirements.txt für den install_requires kwarg in der Datei setuptools setup.py

Ich habe eine requirements.txt Datei, die ich mit Travis-CI verwende. Es scheint albern, die Anforderungen in beiden Dateien zu duplizieren requirements.txt y setup.py Ich hatte gehofft, ein Dateihandle an die Funktion install_requires kwarg in setuptools.setup .

Ist dies möglich? Wenn ja, wie sollte ich vorgehen?

Hier ist mein requirements.txt Datei:

guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4

-1voto

Scrotch Punkte 1138

Querverweis auf meine Antwort von diese SO-Frage für eine weitere einfache, pip-versionssichere Lösung.

try:  # for pip >= 10
    from pip._internal.req import parse_requirements
    from pip._internal.download import PipSession
except ImportError:  # for pip <= 9.0.3
    from pip.req import parse_requirements
    from pip.download import PipSession

requirements = parse_requirements(os.path.join(os.path.dirname(__file__), 'requirements.txt'), session=PipSession())

if __name__ == '__main__':
    setup(
        ...
        install_requires=[str(requirement.req) for requirement in requirements],
        ...
    )

Dann geben Sie einfach alle Ihre Anforderungen unter requirements.txt im Root-Verzeichnis des Projekts.

-2voto

Tuukka Mustonen Punkte 4544

Eine weitere parse_requirements Hack, der auch die Umgebungsmarkierungen in extras_require :

from collections import defaultdict
from pip.req import parse_requirements

requirements = []
extras = defaultdict(list)
for r in parse_requirements('requirements.txt', session='hack'):
    if r.markers:
        extras[':' + str(r.markers)].append(str(r.req))
    else:
        requirements.append(str(r.req))

setup(
    ...,
    install_requires=requirements,
    extras_require=extras
)

Es sollte sowohl sdist als auch binäre Listen unterstützen.

Wie bereits von anderen erwähnt, parse_requirements hat einige Unzulänglichkeiten und sollte daher nicht für öffentliche Projekte verwendet werden, kann aber für interne/persönliche Projekte ausreichend sein.

-2voto

yoonghm Punkte 3302

Ich habe dies getan:

import re

def requirements(filename):
    with open(filename) as f:
        ll = f.read().splitlines()
    d = {}
    for l in ll:
        k, v = re.split(r'==|>=', l)
        d[k] = v
    return d

def packageInfo():
    try:
        from pip._internal.operations import freeze
    except ImportError:
        from pip.operations import freeze

    d = {}
    for kv in freeze.freeze():
        k, v = re.split(r'==|>=', kv)
        d[k] = v
    return d

req = getpackver('requirements.txt')
pkginfo = packageInfo()

for k, v in req.items():
    print(f'{k:<16}: {v:<6} -> {pkginfo[k]}')

-4voto

anatoly techtonik Punkte 18578

Hier ist ein kompletter Hack (getestet mit pip 9.0.1 ) basierend auf Romain's Antwort das analysiert requirements.txt und filtert sie nach dem aktuellen Umweltmarker :

from pip.req import parse_requirements

requirements = []
for r in parse_requirements('requirements.txt', session='hack'):
    # check markers, such as
    #
    #     rope_py3k    ; python_version >= '3.0'
    #
    if r.match_markers():
        requirements.append(str(r.req))

print(requirements)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X