webentwicklung-frage-antwort-db.com.de

Pipenv vs setup.py

Ich versuche nach pipenv zu migrieren. Ich habe traditionell setup.py mit pip und hat pip install -e ., um das Modul als Paket zu installieren, damit ich Dinge wie from myproject.xyz.abc import myClass von überall im Projekt.

Wie erreiche ich den ähnlichen Effekt mit pipenv und werde das setup.py?

Hinweis: Ich verwende python 2.7.

19
khan

Aktualisieren:

pipenv 9.0.0 wurde veröffentlicht , mit dem Sie pipenv install -e . wie erwartet.

Ursprüngliche Antwort:

pipenv install -e ist fehlerhaft und wurde behoben in master ( pull request ). Es wird irgendwann nach Thanksgiving in der nächsten Version verfügbar sein.

Provisorische Problemumgehung für den Moment ist:

pipenv Shell
pip install -e .

Nach der Veröffentlichung sollten Sie in der Lage sein, pipenv install -e . ähnlich wie bei pip.

19
cs01

UPDATE: 5. März 2019: Seit Pip-Version 19.03 können Sie setup.py für Ihre Pakete weglassen und pyproject.toml Und [build-system] (unterstützt keine Installation im bearbeitbaren Modus (in diesem Fall benötigen Sie noch setup.py)

UPDATE: 12. Juni 2018: Ein weiteres ähnliches Tool https://github.com/takluyver/flit . poetry und flit haben eine große Zukunft. Ich hoffe, sie werden ihre Streitkräfte zusammenführen und wir werden komfortable All-in-One-Pakete und App-Verwaltung haben, wie zum Beispiel Rust cargo


UPDATE: 19. April 2018: Es gibt ein ähnliches Tool, das die gesamte Verpackungsverwaltung auf einmal erledigen kann, ohne dass setup.py erforderlich ist. Dies ist https://github.com/sdispater/poetry


UPDATE: 11. April 2018: Der Autor von Pipenv beschreibt das Problem hier: http://pipenv.readthedocs.io/en/latest/advanced/# pipfile-vs-setup-py


Wenn Sie pipenv install -e . In einem Paket ohne setup.py ausführen, erhalten Sie:

$ pipenv install -e .              
Directory '.' is not installable. File 'setup.py' not found.

Für diesen Fall benötigen Sie also ohnehin setup.py.

Es ist wichtig, das Konzept hinter Anwendungen und Paketen zu verstehen. Diese Informationen könnten nützlich sein https://caremad.io/posts/2013/07/setup-vs-requirement/

Wenn Sie eine Anwendung erstellen, benötigen Sie nur pipenv.

Wenn Sie jedoch ein Paket erstellen, müssen Sie trotzdem setup.py Haben, damit pip oder pipenv es installieren kann (möglicherweise auch im bearbeitbaren Modus).

Die Antwort des Autors des pipenv ist hier: https://github.com/pypa/pipenv/issues/1161#issuecomment-349972287

Daher ist pipenv vs setup.py Eine falsche Formulierung. Sie können nicht gegeneinander sein. Unterstützen Sie sich lieber gegenseitig oder schließen Sie sich gegenseitig aus.

Möglicherweise müssen wir einen Weg finden, wie wir beide verwenden können, ohne Dinge zu duplizieren.

Wenn Sie ein Paket erstellen, können Sie zwar weiterhin pipenv verwenden, dies führt jedoch zu Duplikaten (Anforderungen in setup.py und Pipfile). Ich benutze den folgenden Ansatz, um dies zu adressieren:

import pathlib
import subprocess

from setuptools import setup, find_packages
from setuptools.command.install import install
from setuptools.command.develop import develop


__requires__ = ['pipenv']

packages = find_packages(exclude=['tests'])
base_dir = pathlib.Path(__file__).parent

pipenv_command = ['pipenv', 'install', '--deploy', '--system']
pipenv_command_dev = ['pipenv', 'install', '--dev', '--deploy', '--system']

class PostDevelopCommand(develop):
    """Post-installation for development mode."""
    def run(self):
        subprocess.check_call(pipenv_command_dev)
        develop.run(self)

class PostInstallCommand(install):
    """Post-installation for installation mode."""
    def run(self):
        subprocess.check_call(pipenv_command)
        install.run(self)


with open(base_dir / 'README.md', encoding='utf-8') as f:
    long_description = f.read()

setup(
    name='dll_api',
    use_scm_version = True,
    long_description='\n' + long_description,
    packages=packages,
    setup_requires=['setuptools_scm'],
    cmdclass={
        'develop': PostDevelopCommand,
        'install': PostInstallCommand,
    },
)

Jetzt haben Sie Folgendes:

$ python setup.py install
running install
Installing dependencies from Pipfile.lock (e05404)…

Hinweis pipenv sollte vorher installiert werden!

Dies ist kein sauberer Weg, um das Problem zu lösen, erledigen Sie jedoch die Arbeit.

12
Artem Zhukov

In Ihrem Fall ersetzt pipenvpip, aber Sie benötigen noch ein setup.py.

Angenommen, Ihr Verzeichnis ist folgendermaßen aufgebaut:

dir_a/              <-- This will be your pipenv root dir and your package root dir.
    setup.py
    dir_b/
        __init__.py
        somefile.py
        otherfile.py

Dann können Sie eine Python 3-Umgebung initiieren und Ihr Paket installieren, indem Sie Folgendes verwenden:

$> cd dir_a
$> pipenv --python 3
$> pipenv Shell
$> pipenv install -e . 

Sie können überprüfen, ob das Paket installiert wurde, indem Sie cat Pipfile oder pipenv graph.

Jedoch wenn Ihr Paketstammverzeichnis nicht mit Ihrem pipenv-Stammverzeichnis identisch ist, dann pipenv install -e . wird fehlschlagen mit einer mysteriösen Fehlermeldung:

Fehler beim Analysieren der Anforderung. - Sind Sie sicher, dass es installierbar ist?

In diesem Fall sollten Sie pipenv install -e aus dem pipenv-Stammverzeichnis und geben Sie den Pfad zum Stammverzeichnis des Pakets an. Zum Beispiel mit dieser Dateistruktur:

dir_z/              <-- This will be your pipenv root dir.
    something.py
    empty_dir/
    dir_a/          <-- This is your package root dir.
        setup.py
        dir_b/
            __init__.py
            somefile.py
            otherfile.py

Sie würden verwenden:

$> cd dir_z
$> pipenv --python 3
$> pipenv Shell
$> pipenv install -e dir_a/

Wie von einem anderen Benutzer erwähnt, wird pip install -e . installiert das Paket in der virtuellen Umgebung von dir_a In diesem Szenario. Zumindest für mich wird das Pipfile jedoch nicht aktualisiert und ist daher nicht von großem Nutzen.

2
FiddleStix