Welche Dateien sind erforderlich für Py_Initialize zu laufen?
Arbeite ich an ein einfaches Stück code, der ausgeführt wird eine Python-Funktion aus einem C/C++ - Anwendung. Um dies zu tun, habe ich den PYTHONPATH initialisieren und ausführen wie folgt:
Py_SetPythonHome("../Python27");
Py_InitializeEx(0);
Dann ich Importiere mein Modul und meine Funktion. Es funktioniert Super.
Bin ich nun auch versuchen zu bauen ein Installationsprogramm für meine Kollegen meinen code. Ich möchte zum minimieren der Anzahl der Dateien, die ich brauchen, um in das Installationsprogramm, aus offensichtlichen Gründen.
Googeln rund um das Thema sagt mir, dass ich sollte in der Lage sein, um die Dateien "Python27.lib" und "Python27.dll" dann zip die "DLLs" und "Lib" Ordner und fügen Sie Sie. Jedoch wenn ich versuche dies, Py_Initialize ausfällt.
Einer schnellen Untersuchung, was die Ursache für dieses scheitern zeigt, dass Py_Initialize scheint, hängt eine Anzahl von .pyc Dateien in den Lib-Ordner, einschließlich (aber nicht beschränkt auf Warnungen.pyc, _abcoll.pyc, _future_.pyc und die Inhalte der "Codierungen" - Ordner.
Kann ich nicht verstehen, warum das so sein soll. Irgendwelche Ratschläge?
this hilfreich?
Dank Cristi. War nicht in der Lage, testen Sie Ihre Lösung über das Wochenende. Ich Teste es jetzt. Vielen Dank für Ihre Hilfe!
InformationsquelleAutor Matt McC | 2016-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Am Anfang wollte ich sagen, dass es kein Modul erforderlich (zumindest nicht nicht-builtin) für Py_InitializeEx, so dass die einzige Voraussetzung war python27.dll (btw: python27.lib ist nicht erforderlich, es sei denn, deine Kollegen wollen link etwas gegen ihn - aber das wäre nicht sehr einfach w/o Python's Gehören dir). Ich hatte diesen code (BTW: ich bin mit 2.7.10 Python, die ich gebaut mit VStudio 10 (2010)):
Baute es in Ordnung, es lief OK aus VStudio, und von der Befehl-Linie (nach dem kopieren der .dll in seinem Ordner). Aber dann kopierte ich die .exe und .dll zu einem anderen computer, und, wenn ausgeführt wird, bang!!!
In der Erwägung, dass
Ich weiß nicht, warum es nicht immer auf die gleiche (eine Sache, die ich noch nicht überprüfen, ist, dass es möglicherweise einige Registrierungsschlüssel auf dem Computer, der funktioniert?).
Hinweis: Website ist ein (.py(c)) - Modul befindet sich unter %PYTHON_INSTALL_DIR%\Lib.
Dann stöberte ich Python's source-code und stieß ich auf diese (Datei: pythonrun.c, line: 269, Funktion Py_InitializeEx oder pythonrun.c:269: Py_InitializeEx - das ist, wie werde ich zu finden eine Stelle im Quelltext):
während in pythonrun.c:727: initsite:
ist ziemlich offensichtlich (Py_NoSiteFlag 0).
Dann bemerkte ich, dass Py_NoSiteFlag erklärt wird
extern __declspec(dllexport)
([MS. Docs]: die Verwendung von extern Angeben Verknüpfung, [MS. Docs]: dllexport, dllimport), so dass ich meine modifizierten code:- und es funktioniert! Yay!
So, an dieser Stelle nur die .dll ist erforderlich, um führen Sie ein Stück code. Aber ich kann mir vorstellen, dass Ihr code ist "ein wenig" komplexer ist, als dass (es hat imports ([Python-2]: import - Anweisung). Zum lösen der import problem, Sie können dieses nette Modul: [Python 2]: modulefinder - Finden-Module verwendet, die von einem Skript (Teil Python 2.7's standard-Module). Nutzen:
Hier ein Beispiel für meinen code (pyCode Inhalt in meinem C - Programm, gespeichert in einer Datei).
code.py:
Läuft
ergibt:
Aber, wenn ich eine
import os
(das ist ein ziemlich gemeinsames Modul) - Anweisung in der Datei, die obige Befehl liefert:Wie Sie sehen können, gibt es schrecklich viele Module (modifizierte ich die Ausgabe ein wenig, statt den tatsächlichen Pfad legte ich den %PYTHON_INSTALL_DIR% env var). Um für die Python code arbeiten, werden Sie haben, um alle diese Module/Pakete im installer.
Hinweise über modulefinder's Ausgabe (, dass ich bemerkt habe, während Sie mit ihm spielen):
So, wer die Module, die erforderlich sind os, ich bin mir nicht sicher, dass die Einnahme aus der Website import von C macht einen großen Unterschied.
WICHTIGER HINWEIS: Um sicherzustellen, dass Ihr .exe funktioniert auf jedem computer, sollten Sie erwägen, einschließlich VStudio C-Laufzeit-Bibliothek (msvcr##(#).dll: [MS. Docs]: Run-Time Library Reference) (wo #s sind Platzhalter für Ziffern - repräsentieren VStudio version) in Ihrem installer.
InformationsquelleAutor CristiFati