PyImport_Import schlägt fehl (gibt NULL zurück)

Lesezeit: 3 Minuten

Alexanders Benutzeravatar
Alexander

Ich bin ein Neuling in Python, also ist das vielleicht eine dumme Frage. Ich möchte ein einfaches C-Programm mit eingebettetem Python-Skript schreiben. Ich habe zwei Dateien:

Anruffunktion.c:

    #include <Python.h>
    int main(int argc, char *argv[])
    {
        PyObject *pName, *pModule, *pDict, *pFunc, *pValue;

        if (argc < 3)
        {
            printf("Usage: exe_name python_source function_name\n");
            return 1;
            }

        // Initialize the Python Interpreter
        Py_Initialize();

        // Build the name object
        if ((pName = PyString_FromString(argv[1])) == NULL) {
            printf("Error: PyString_FromString\n");
            return -1;
        }

        // Load the module object
        if ((pModule = PyImport_Import(pName)) == NULL) {
            printf("Error: PyImport_Import\n");
            return -1;
        }

        // pDict is a borrowed reference 
        if ((pDict = PyModule_GetDict(pModule))==NULL) {
            printf("Error: PyModule_GetDict\n");
            return -1;
        }
...

Und

hallo.py:

def hello():
    print ("Hello, World!")

Ich kompiliere und führe dies wie folgt aus:

gcc -g -o call-function call-function.c -I/usr/include/python2.6 -lpython2.6
./call-function hello.py hello

und habe das:

Error: PyImport_Import

dh PyImport_Import kehrt zurück NULL. Können Sie mir bei diesem Problem helfen? Jede Hilfe wird geschätzt.

Besten Wünsche,

Alex

  • Sie haben den Schritt vergessen, in dem Sie ein Fünfeck in Hühnerblut zeichnen und die schwarzen Kerzen anzünden: P … das funktioniert normalerweise für mich, wenn ich C und Python mischen muss

    – Joran Beasley

    8. Juli 2013 um 17:27 Uhr

  • Sieht aus wie argv[0] wird der Exe-Name sein, argv[1] wird sein hello.pyUnd argv[2] wird sein hello. Möchten Sie stattdessen etwas anderes importieren? argv[1]? Sie brauchen den Modulnamen, nicht den Quelldateinamen, oder?

    – Brian

    8. Juli 2013 um 17:32 Uhr


  • Ja, das ist richtig. Aber ich dachte, dass der Modulname derselbe ist wie der Dateiname. Ist es richtig?

    – Alexander

    8. Juli 2013 um 17:41 Uhr

  • Der Modulname lautet hello. Das Gleiche gilt für Standard-Python-Skripte. Du konntest nicht rennen python -c "import hello.py" entweder aus dem lokalen Verzeichnis.

    – Viraptor

    8. Juli 2013 um 17:53 Uhr

Ich habe dieses Problem gelöst, indem ich PYTHONPATH auf gesetzt habe pwd. Auch der Modulname (ohne .py) sollte für argv gesetzt werden[1].

Danke schön!

  • Hat mir jede Menge Ärger erspart! Du bist großartig, weil du das selbst beantwortest. +1

    – Christoph Galpin

    11. Dezember 2014 um 7:06 Uhr


  • Das hat bei mir auch funktioniert! Unglaublich und völlig unintuitiv, wenn man bedenkt, dass py.exe und python.exe den vollständigen Namen des Skripts erfordern. Danke schön!!

    – James

    18. Dezember 2015 um 0:19 Uhr

  • Danke schön! Wow – den ganzen Abend damit verbracht. Danke danke danke.

    – Kevin Packard

    6. September 2019 um 2:14 Uhr

  • Vielen Dank. Aber warum müssen wir PYTHONPATH auf pwd setzen???

    – VMS

    19. Februar 2020 um 12:00 Uhr

Ich bin auch auf dieses Problem gestoßen, nachdem ich eine Weile gekämpft hatte. Nachdem ich im Internet gesucht hatte, stellte ich fest, dass es sich um ein Problem mit dem Systempfad handelte. Nach dem Hinzufügen der beiden Zeilen nach Py_Initialize(); es funktionierte.

Betriebssystem: Windows 7, Compiler: Embarcadero C++ Builder XE6, Python: Version 2.7

Referenz: C++ mit Python

Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\"C:\\Python27\")");

  • Ich habe das gleiche Problem und habe die von Ihnen empfohlenen 2 Zeilen hinzugefügt, indem ich path.append in “c:\python35” geändert habe, wo meine Python-Bibliotheken und DLLs vorhanden sind, aber es hat mir nicht geholfen. PyImport_Import() gibt immer NULL zurück.

    – James

    18. Dezember 2015 um 0:15 Uhr

  • Ich habe Alexanders Lösung mit und ohne Ihre Empfehlung ausprobiert und es schien keinen Unterschied zu machen. Allerdings behalte ich es für alle Fälle drin. 😉

    – James

    18. Dezember 2015 um 0:24 Uhr


  • Funktioniert auch gut unter Linux.

    – Asche

    11. Dezember 2018 um 12:14 Uhr

Benutzeravatar von Alfons
Alfons

Wenn sich die Python-Quelldatei im Arbeitsverzeichnis befindet (dh dort, wo sich die *.cpp-Dateien des Projekts befinden), können Sie Folgendes verwenden:

PyRun_SimpleString("sys.path.append(os.getcwd())");

… um das Arbeitsverzeichnis zum Python-Pfad hinzuzufügen.

  • Sie haben PyRun_SimpleString (“import os”) vergessen;

    – WurmD

    1. April 2020 um 16:25 Uhr

  • und vergiss nicht, sys zu importieren 🙂

    – Avrdan

    19. Mai 2022 um 16:08 Uhr

Benutzeravatar von mybodycravesbutterygoodness
mein Körper sehnt sich nach butterartiger Güte

Dies ist ein obskurer Fall, aber meine Python-Funktion importierte Code, für den argv festgelegt werden musste. Um das zu beheben musste ich hinzufügen:

PySys_SetArgv(argc, argv);

nach dem Aufruf von Py_Initialize() und es begann zu arbeiten.

1443850cookie-checkPyImport_Import schlägt fehl (gibt NULL zurück)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy