Robuster Weg, um sicherzustellen, dass andere Leute mein Python-Programm ausführen können

17

Ich möchte ein Python-Programm auf GitHub platzieren und andere Leute es herunterladen und auf ihren Computern mit verschiedenen Betriebssystemen ausführen lassen. Ich bin relativ neu in Python, habe es aber genug verwendet, um zu bemerken, dass es problematisch sein kann, die verschiedenen Versionen aller enthaltenen Module zusammenzubringen. Ich habe gerade die Verwendung von entdeckt requirements.txt(generiert mit pipreqsund bereitgestellt mit dem Befehl pip install -r /path/to/requirements.txt), war aber sehr überrascht zu bemerken, dass requirements.txtnicht angegeben wird, welche Version von Python verwendet wird, so dass es offensichtlich nicht die vollständige Lösung für sich ist. Meine Frage lautet also: Welche Spezifikationen / Dateien / etwas anderes wird benötigt, um sicherzustellen, dass jemand, der mein Projekt herunterlädt, es tatsächlich mit möglichst wenigen Problemen ausführen kann.

EDIT: Mein Plan war es, mich von der Antwort leiten zu lassen, die die meisten positiven Stimmen erhielt. Aber bis jetzt hat nach 4 Antworten und 127 Ansichten keine einzige Antwort auch nur eine positive Bewertung. Wenn einige der Antworten nicht gut sind, wäre es nützlich, einige Kommentare zu sehen, warum sie nicht gut sind.

Mick
quelle
1
Haben Sie für möglichst wenige Probleme Docker (oder andere containergestützte Lösungen) in Betracht gezogen? docker.com
Zaccharie Ramzi
Re: Docker ... Ich habe gerade Folgendes gefunden: "Der Entwickler kann sicher sein, dass die Anwendung auf jedem anderen Linux-Computer ausgeführt wird" - aber ich möchte, dass dies auf jedem Betriebssystem funktioniert. ( opensource.com/resources/what-docker )
Mick
Normalerweise unterstützen Sie alle klassischen Betriebssysteme: Windows ( docs.docker.com/docker-for-windows ) und Mac ( docs.docker.com/docker-for-windows )
Zaccharie Ramzi
2
Die Antwort hier ist sehr kontextbezogen. Tut das Python-Programm Dinge, die Funktionen vom Typ sysoder osoder vom Unterprozess oder mathematischer / analytischer sind? Ersteres kann sich mit jeder Version von Python ändern und später kann es ziemlich versionunabhängig sein. Welche abhängigen Bibliotheken? Numpy und Pandas leisten plattformübergreifend hervorragende Arbeit, sodass Sie einfach überprüfen können, ob Sie eine Min-Version haben. Welche Hauptversion von Python? Der Unterschied zwischen Python 2.x und 3.x mit abhängigen Bibliotheken wird noch schwieriger. Wenn Sie guten Code für eine gängige Hauptversion schreiben, ist dies ein guter Anfang.
Morgengrauen
2
Wie die unzähligen Antworten belegen, gibt es so viele Möglichkeiten, dies zu tun. Ich bin wirklich neugierig, ob sich die Antworten ändern würden, wenn ich weiß, was die Anwendung ist. Ich würde gerne glauben, dass es keine Rolle spielen sollte, aber ich vermute, dass es möglich ist. Ich denke auch, dass es sehr stark vom beabsichtigten Publikum abhängt. Versierte Physik-Doktorandin, die eine maschinelle Lernanwendung gegen Joe Internet betreibt und ein Pygame von Dame spielt.
Marcel Wilson

Antworten:

15

Haben Sie darüber nachgedacht, eine setup.pyDatei einzurichten ? Es ist eine praktische Möglichkeit, all Ihre ... gut eingerichteten Daten an einem einzigen Ort zu bündeln. Alles, was Ihr Benutzer tun muss, ist A) Ihr Repo zu klonen und B) auszuführen pip install ., um das auszuführensetup.py

Es gibt eine großartige Stack-Diskussion darüber.

Sowie ein Handle-Beispiel, das vom Anforderer geschrieben wurde.

Dies sollte die meisten Anwendungsfälle abdecken. Wenn Sie es nun wirklich verteilbar machen möchten, sollten Sie es in PyPi , dem offiziellen Distributionszentrum, einrichten .

Wenn Sie darüber hinaus fragen, wie Sie ein Programm "OS-unabhängig" machen können, gibt es keine Einheitsgröße. Es hängt davon ab, was Sie mit Ihrem Code machen. Erfordert die Untersuchung, wie Ihr bestimmter Code mit diesen Betriebssystemen usw. interagiert.

Taylor Cochran
quelle
7

Es gibt viele, viele, viele, viele, viele, viele, viele Möglichkeiten, dies zu tun. Ich werde die Prinzipien hinter jedem skaten und es ist ein Anwendungsfall.

1. Eine Python-Umgebung

Es gibt viele Möglichkeiten, dies zu tun. pipenv, conda requirments.txt, etc etc.

Mit einigen davon können Sie Python-Versionen angeben. Geben Sie bei anderen nur eine Reihe von Python-Versionen an, von denen Sie wissen, dass sie funktionieren. Wenn Sie beispielsweise Python 3.7 verwenden, wird 3.6 wahrscheinlich nicht unterstützt. Es gibt nur ein oder zwei kleinere Änderungen. 3.8 sollte auch funktionieren.

Eine andere ähnliche Methode ist setup.py. Diese werden im Allgemeinen verwendet, um Bibliotheken - wie PyInstaller (eine andere Lösung, die ich unten erwähne) oder numpy oder wxPython oder PyQt5 usw. - für den Import / die Befehlszeilenverwendung zu verteilen. Die Python-Verpackungsanleitung ist sehr nützlich, und es gibt viele Tutorials. (google python setup.py tutorial) In diesen Dateien können Sie auch Anforderungen angeben.

2. Ein Container

Docker ist der Große. Wenn Sie noch nichts davon gehört haben, werde ich überrascht sein. Eine schnelle Google einer Zusammenfassung kommt mit bis diese , die ich Teil zitieren werde von:

Warum liebt jeder Container und Docker? James Bottomley, ehemals CTO für Servervirtualisierung bei Parallels und führender Linux-Kernel-Entwickler, erklärte, dass VM-Hypervisoren wie Hyper-V, KVM und Xen "alle auf der Emulation virtueller Hardware basieren. Das heißt, sie sind fett in Bezug auf System Anforderungen."

Container verwenden jedoch gemeinsam genutzte Betriebssysteme. Dies bedeutet, dass sie in Bezug auf die Systemressourcen viel effizienter sind als Hypervisoren. Anstatt Hardware zu virtualisieren, ruhen Container auf einer einzelnen Linux-Instanz. Dies bedeutet, dass Sie "den nutzlosen VM-Müll von 99,9 Prozent zurücklassen und eine kleine, ordentliche Kapsel mit Ihrer Anwendung zurücklassen können".

Das sollte es für Sie zusammenfassen. (Beachten Sie, dass Sie kein bestimmtes Betriebssystem für Container benötigen.)

3. Eine ausführbare Datei

Zum Zeitpunkt des Schreibens gibt es zwei Hauptwerkzeuge, die dies tun. PyInstaller und cx_Freeze. Beide werden aktiv weiterentwickelt. Beide sind Open Source.

Sie nehmen Ihr Skript und das Tool kompiliert es zu Bytecode, findet die Importe, kopiert diese und erstellt eine tragbare Python-Umgebung, die Ihr Skript auf dem Zielsystem ausführt, ohne dass der Endbenutzer Python benötigt.

Ich persönlich bevorzuge PyInstaller - ich bin einer der Entwickler. PyInstaller bietet alle Funktionen über ein Befehlszeilenskript und unterstützt die meisten Bibliotheken, die Sie sich vorstellen können - und ist erweiterbar, um mehr zu unterstützen. cx_Freeze erfordert ein Setup-Skript.

Beide Tools unterstützen Windows, Linux, MacOS und mehr. PyInstaller kann einzelne Datei-Exes oder ein Paket mit einem Ordner erstellen, während cx_Freeze nur ein Ordner-Bundle unterstützt. PyInstaller 3.6 unterstützt Python 2.7 und 3.5-3.7 - aber 4.0 wird nicht unterstützt Python 2. cx_Freeze abgesunken Python 2 - Unterstützung der letzten Hauptversion (6.0 glaube ich).

Wie auch immer, genug über die Tools-Funktionen; Sie können diese selbst untersuchen. ( Weitere Informationen finden Sie unter https://pyinstaller.org und https://cx-freeze.readthedocs.io. )

Wenn Sie diese Verteilungsmethode verwenden, stellen Sie normalerweise Quellcode auf dem GitHub-Repo bereit, einige Exes (eine für jede Plattform), die zum Herunterladen bereitstehen, und Anweisungen zum Erstellen des Codes in eine ausführbare Datei.

Legorooj
quelle
1

Das beste Werkzeug, das ich bisher dafür verwendet habe, ist Pipenv . Es vereinheitlicht und vereinfacht nicht nur den gesamten pip + virtualenv-Workflow für Sie als Entwickler, sondern garantiert auch, dass die genauen Versionen aller Abhängigkeiten (einschließlich Python selbst) erfüllt werden, wenn andere Personen Ihr Projekt damit ausführen.

Auf der Projektwebsite wird die Verwendung des Tools sehr gut erklärt, der Vollständigkeit halber werde ich hier jedoch eine kurze Erklärung geben.

Sobald Sie Pipenv installiert haben (z. B. durch Ausführen pip install --user pipenv), können Sie in das Verzeichnis Ihres Projekts pipenv --python 3.7wechseln und es ausführen , sodass Pipenv eine neue virtuelle Umgebung für Ihr Projekt erstellt, eine Pipfile und eine Pipfile.lock erstellt (dazu später mehr). . Wenn Sie fortfahren pipenv install -r requirements.txt, werden alle Ihre Pakete installiert. Jetzt können Sie a pipenv shellausführen, um Ihre neue virtuelle Umgebung zu aktivieren, oder a, pipenv run your_main_file.pyum einfach Ihr Projekt auszuführen.

Schauen wir uns nun den Inhalt Ihrer Pipfile an. Es sollte etwas Ähnliches sein:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

Diese Datei enthält die für Menschen lesbaren Spezifikationen für die Abhängigkeiten Ihres Projekts (beachten Sie, dass sie auch die Python-Version angibt). Wenn Ihre Anforderungen.txt Versionen angeheftet hatten, könnte Ihre Pipfile diese auch haben, aber Sie können sie sicher mit einem Platzhalter versehen, da die genauen Versionen in Pipfile.lock gespeichert sind. Jetzt können Sie beispielsweise pipenv updateIhre Abhängigkeiten aktualisieren und vergessen nicht, Pipfile und Pipfile.lock für Ihr VCS zu übernehmen.

Sobald die Leute Ihr Projekt pipenv installgeklont haben, müssen sie es nur noch ausführen und Pipenv kümmert sich um den Rest (möglicherweise wird sogar die richtige Version von Python für sie installiert).

Ich hoffe das war nützlich. Ich bin in keiner Weise mit Pipenv verbunden, wollte nur dieses großartige Tool teilen.

gflorio
quelle
1

Wenn sich Ihr Programm weniger mit GUI befasst oder über eine Web-GUI verfügt, können Sie den Code mithilfe von Google Colaboratory freigeben.

https://colab.research.google.com/

Jeder kann es mit derselben Umgebung ausführen. Keine Installation erforderlich.

Korakot
quelle
1

Wenn Ihnen das Konvertieren aller Ihrer Python-Skripte in eine ausführbare Datei helfen kann, hilft meine Antwort unten ...

Ich habe seit 3 ​​Jahren eine große Desktop-Anwendung ausschließlich in Python entwickelt. Es ist ein GUI-basiertes Tool, das auf der pyqt-Bibliothek basiert (Python-Bindungen des QT C ++ - Frameworks).

Ich verwende derzeit die Paketbibliothek " py2exe ": ist eine distutils-Erweiterung, mit der eigenständige ausführbare Windows-Programme (32-Bit und 64-Bit) aus Python-Skripten erstellt werden können. Alles was Sie tun müssen ist:

  1. install py2exe: 'pip install py2exe'

  2. Erstellen Sie ein setup.py-Skript: Hiermit wird der Inhalt der endgültigen EXE-Datei angegeben (Name, Symbol, Autor, Datendateien, gemeinsam genutzte Bibliotheken usw.)

  3. Ausführen: python setup.py py2exe

Ich verwende auch die Software "Inno Setup" , um ein Installationsprogramm zu erstellen: Erstellen von Verknüpfungen, Festlegen von Umgebungsvariablen, Symbolen usw.

Rida Shamasneh
quelle
py2exe wurde seit Jahren nicht mehr aktualisiert. Ich kann keine aktuellen Aktivitäten finden. Ich würde dann annehmen, dass es nicht gewartet wird. (Außerdem werden nur Python <3.4 unterstützt. Dies bedeutet, dass nur veraltete Python-Versionen unterstützt werden.)
Legorooj
-1

Da es in den anderen Antworten fehlt, möchte ich einen ganz anderen Aspekt hinzufügen:

Unit Testing. Oder allgemein testen.

Normalerweise ist es gut, eine bekannte gute Konfiguration zu haben. Abhängig von den Abhängigkeiten des Programms müssen Sie möglicherweise verschiedene Paketkombinationen testen. Sie können dies automatisiert mit z. B. toxoder als Teil einer CI / CD-Pipeline tun .

Es gibt keine allgemeine Regel, welche Paketkombination getestet werden soll, aber normalerweise ist die Python2 / 3-Kompatibilität ein Hauptproblem. Wenn Sie starke Abhängigkeiten von Paketen mit großen Versionsunterschieden haben, sollten Sie in Betracht ziehen, diese verschiedenen Versionen zu testen.

Dschoni
quelle
Dies ist ein sehr wichtiger Aspekt der Softwareentwicklung. Dies beantwortet die Frage jedoch nicht vollständig . Wie hilft Unit Testing bei der Verteilung eines Programms?
Legorooj
Meiner Meinung nach fragt OP nicht speziell nach der Verteilung. Er fragt nach Möglichkeiten, um sicherzustellen, dass andere Leute sein Programm ausführen können. Ich denke, Unit-Tests können dabei tatsächlich helfen, da die Anzahl der Pakete, die verwendet werden können, möglicherweise eingeschränkt ist. Im Allgemeinen ist die Verteilungsfrage wichtig (und wurde hier beantwortet), aber ich denke, in einem realen Szenario können wir uns nicht darauf verlassen, ein ganzes Venv nur für ein einziges Paket zu erstellen - es muss mit mindestens einigen Standardkonfigurationen kompatibel sein.
Dschoni
Ich streite nicht , dass Unit - Tests bei der Herstellung sicher wertvoll ist es läuft richtig, aber der OP gefragt , wie Sie den Code in einer teilen Mode „einfach zu installieren“. Deshalb denke ich, dass dies eine ungültige Antwort ist - für diese spezielle Frage.
Legorooj
Ich denke immer noch, dass es nicht nur um die Verteilung geht. Deshalb habe ich diese Antwort hinzugefügt. Wenn Sie beispielsweise unter Windows entwickeln, ist das Testen unter Unix unerlässlich, wenn Sie sicherstellen möchten, dass es vor der Verteilung ausgeführt wird.
Dschoni
Wie unterscheidet sich aus Neugier von dem, was ich gerade gesagt habe? ... making sure it runs correctly ...? Testing ist ein wesentlicher Bestandteil , sicherzustellen, läuft es richtig, deshalb ist es ein wesentlicher Bestandteil der Vorbereitung zu verteilen, aber es ist noch nichts mit tatsächlich zu tun zu verteilen es
Legorooj
-1

Ich werde Ihnen eine sehr kurze Zusammenfassung einiger der vorhandenen verfügbaren Lösungen geben, wenn es um Python-Verpackungen geht, aus denen Sie auswählen können (Wissen ist Macht):

  1. Befolgen Sie die Richtlinien unter Strukturieren Ihres Projekts . Diese Konventionen werden von der Python-Community weitgehend akzeptiert und sind normalerweise ein guter Ausgangspunkt, wenn Neulinge mit dem Codieren in Python beginnen. Wenn Sie diese Richtlinien befolgen, wissen Pythonisten, die Ihr Projekt / Ihre Quelle bei Github oder anderen ähnlichen Orten ansehen, sofort, wie es installiert wird. Das Hochladen Ihres Projekts auf pypi sowie das Hinzufügen von CI unter Befolgung dieser Regeln ist ebenfalls problemlos.

  2. Sobald Ihr Projekt gemäß den Standardkonventionen richtig strukturiert ist, können im nächsten Schritt einige der verfügbaren Gefriergeräte verwendet werden , falls Sie Ihren Endbenutzern ein Paket senden möchten, das sie installieren können, ohne dass sie gezwungen sind, Python auf ihren zu installieren Maschinen. Beachten Sie jedoch, dass diese Tools keinen Codeschutz bieten. Andernfalls wäre das Extrahieren des ursprünglichen Python-Codes aus den endgültigen Artefakten in allen Fällen trivial

  3. Wenn Sie Ihr Projekt dennoch an Ihre Benutzer senden möchten , ohne sie zur Installation von Entwicklungsabhängigkeiten zu zwingen, und Sie sich auch für den Codeschutz interessieren , damit Sie keine der vorhandenen Gefriergeräte in Betracht ziehen möchten, verwenden Sie möglicherweise Tools wie Nuitka , Shedskin , Cython oder ähnliche. Normalerweise ist das Umkehren von Code aus den von diesen Tools erzeugten Artefakten überhaupt nicht trivial ... Der Cracking-Schutz ist eine andere Sache, und wenn Sie Ihrem Endbenutzer keine physische Binärdatei zur Verfügung stellen, können Sie nicht viel tun darüber anders als sie zu verlangsamen :)

  4. Falls Sie in Ihrem Python-Projekt externe Sprachen verwenden müssen, ist https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages ​​ein weiterer klassischer Link, der Ihnen in den Sinn kommt. Fügen Sie CI die Build-Systeme solcher Tools hinzu Regeln von 1 wären ziemlich einfach.

Trotzdem würde ich vorschlagen, bei Bulletpoint 1 zu bleiben, da ich weiß, dass dies mehr als gut genug ist, um Ihnen den Einstieg zu erleichtern. Außerdem sollte dieser bestimmte Punkt viele der vorhandenen Anwendungsfälle für Python- "Standard" -Projekte abdecken.

Obwohl dies kein vollständiger Leitfaden sein soll, können Sie Ihr Python-Projekt in kürzester Zeit für die Massen veröffentlichen.

BPL
quelle