2016-03-19 10 views
1

Ich habe eine Bibliothek in Python erstellt. Ich kann es unter Linux oder Windows verwenden. Ich würde gerne in der Lage sein, von fast allen Nicht-Python-Skripten/-Programmen aus auch dorthin zu schreiben. Idealerweise hätte ich gerne eine plattformübergreifende Option, aber Linux ist für den Moment am wichtigsten. Gibt es das irgendwie anders als über eine Eingabeaufforderungsschnittstelle und das Ausführen von Systemaufrufen/ShellExec-Stilen des Skripts? Wenn dies alles Windows-basierte Programmierung wäre, könnte ich zum Beispiel eine DLL erstellen ... Es wäre aber toll, wenn ich die Bibliothek direkt irgendwie von say php in Linux und C++ in Windows usw. verwenden könnte. Irgendwelche Ideen?Universelle (oder beste) Option, um Python aus anderen Sprachen aufzurufen?

Antwort

0

Das Tätigen von Anrufen ist eine umfassende Beschreibung, und die Lösung hängt davon ab, ob Sie Ausgaben von diesen Anrufen ausgeben und empfangen möchten. Wenn Sie das tun, können Sie einer ziemlich generischen Lösung zwischen PHP und Python mit JSON folgen. Für PHP: HINWEIS: Nicht mein Code, siehe Original here.

// This is the data you want to pass to Python 
    $data = array('as', 'df', 'gh'); 

    // Execute the python script with the JSON data 
    $result = shell_exec('python /path/to/myScript.py ' . escapeshellarg(json_encode($data))); 

    // Decode the result 
    $resultData = json_decode($result, true); 

    // This will contain: array('status' => 'Yes!') 
    var_dump($resultData); 

Und für Python:

import sys, json 

    # Load the data that PHP sent us 
    try: 
     data = json.loads(sys.argv[1]) 
    except: 
     print "ERROR" 
     sys.exit(1) 

    # Generate some data to send to PHP 
    result = {'status': 'Yes!'} 

    # Send it to stdout (to PHP) 
    print json.dumps(result) 

Natürlich, wenn Sie dies könnte genug sein, mit system oder popen in PHP nicht brauchen. Prüfen Sie auch:

Question 1 Question 2

+0

Danke. Ich möchte Daten in beiden Richtungen weitergeben. Das Problem mit Ihrer Antwort ist, dass sie tatsächlich Systemaufrufe/Shellex verwendet, was die unmittelbare Lösung ist, die mir in den Sinn kam, aber diejenige ist, nach der ich eine Alternative suchte. Interessanterweise enthielt einer Ihrer Links einen Link zu http://www.csh.rit.edu/~jon/projects/pip/, der zumindest für Python/PHP eine interessante Möglichkeit bietet (wenn auch nicht "universell"). Lösung). – BuvinJ

+0

Vermutlich gibt es keine vermeidbare Befehlsschnittstelle für das, was ich will ... – BuvinJ

+0

Es muss an einem Punkt passieren, es sei denn, Sie haben eine Möglichkeit, Python-Syntax in PHP zu konvertieren oder wie in dem Link, den Sie gepostet haben Öffne den Python-Interpreter (was, wie ich vermute, ein neuer Alptraum sein wird, sobald du anfangen willst, Bibliotheken in deine Python-Bibliotheken zu laden). In jedem Fall scheint der Link Update und das Projekt aktiv zu sein. Warum kontaktierst du nicht einfach den Typen, der es gemacht hat, und fragst, ob es für das, was du versuchst, funktionieren würde? – armatita

1

Da Sie sagten, Sie nicht die Befehlszeilenschnittstelle verwenden möchten, die logische Antwort für plattformübergreifende Zugriff auf einen Service ist eine Web-API zu verwenden. Auf diese Weise kann der Benutzer der API auf einem anderen Betriebssystem als der Anbieter ausgeführt werden.

Ich habe APIs eingerichtet, bevor Sie diesem blog post folgen. Es gibt eine vollständigere Liste Ihrer Python-Optionen here.

+0

Ich denke, das ist eine ausgezeichnete Lösung im Allgemeinen und hat Sie dafür aufgerüstet. Es vermeidet eine Befehlszeilenschnittstelle, vermeidet Unterprozesse und ist plattformübergreifend! Ich habe die Details meines unmittelbaren Anwendungsfalls nicht angegeben, aber im Grunde handelt es sich bei dieser spezifischen Bibliothek, die ich entwickle, um eine Kette von privaten sicheren Server-zu-Server-HTTPS-Posts (und anderen Webprotokollen). Ich möchte ein Client-Ende, das einen Bibliotheksdienst bietet, der es von Posts, SSL-Zertifikaten, http-Codes usw. isoliert. Also wird diese Lösung für diesen Zweck irgendwie überflüssig und albern sein.(Nicht deine Schuld, ich habe nicht alle diese Details im Voraus erwähnt!) – BuvinJ

+0

Hmm, ich dachte an https://docs.python.org/2/extending/embedding.html, aber du sagtest: "Rufe Anrufe von fast allen an ... Skript/Programm ". Eingebettete Python funktioniert nur, wenn Sie den Client auch schreiben. Die andere Möglichkeit wäre, ein Verzeichnis zu haben, das Sie ansehen und in dem der Client Anforderungen einfügen und dann nach der Antwortdatei suchen muss. Nur für Unix gibt es Named Pipes. –

+0

Ein weiterer guter Vorschlag. Ich dachte, wenn ich das nur in Windows erreichen wollte, könnte ich Python wahrscheinlich in eine C++ - DLL einbetten. Ich glaube, dass eine DLL für alle anderen MS-Technologien kompatibel gemacht werden kann, z. C#, VB, etc. Das hilft allerdings nicht bei Linux, außer es gibt ein Linux-Äquivalent einer DLL? – BuvinJ