2016-03-22 7 views

Antwort

1

Simpliest Weg, dies zu tun, ist pyximport zu verwenden:

in Ihrem main.py hinzufügen:

import pyximport 
pyximport.install(setup_args={'include_dirs': np.get_include()}) 
import cython_helper 

und platzieren Sie Ihre cython Code in cython_helper.pyx Datei.

Wenn Sie diese auf Windows liefen, bevor Ihr Python-Code runing sollten Sie ENV Variable (VS 2013) gesetzt:

SET VS90COMNTOOLS=%VS120COMNTOOLS% 
1

Die Frage zwei verschiedene Dinge bedeuten könnte:

  1. Sie haben eine .pyx-Quelldatei, aber Sie behandeln sie wie jedes alte Python-Skript und möchten lediglich die Aktionen des Skripts aufrufen.

  2. Ihre .pyx-Datei ist ein Erweiterungsmodul, und nachdem es erstellt wurde, möchten Sie daraus importieren.

Sie können wie in der anderen Antwort pyximport für diese, aber ein weiteres nützliches Werkzeug ist die jüngste runcython project. Wenn runcython installiert ist, dann für Fall 1 oben, können Sie einfach tun:

runcython my_file.pyx 

aus Ihrer Eingabeaufforderung und my_file.pyx wird kompiliert werden, dann auf die gleiche Art und Weise ausgeführt, dass jede generische Python-Skript wäre. Alle Top-Level-Anweisungen werden ausgeführt, aber eine zusätzliche Konvention wird hinzugefügt: Wenn in Ihrem Skript eine Funktion mit dem Namen main vorhanden ist, wird runcython sie automatisch aufrufen und sie wie den Abschnitt if __name__ == '__main__' eines generischen Python-Skripts behandeln. Wenn Sie also mit Cython "scripten" möchten, sollten Sie alle Ihre Top-Level-Definitionen machen, aber dann die gesamte Arbeit in eine Top-Level-Funktion namens main einfügen, die zuletzt definiert ist.

Beachten Sie, dass der üblicher if __name__ == '__main__' Trick nicht mit Erweiterungsmodulen im Allgemeinen arbeiten, weil unter der Haube auf dem Prozess python -m Modul Ausführung beruht, die die Standard-Bibliothek verwendet runpy und runpy erfordert es von den ein Codeobjekt zu sein ausgeführtes Modul - etwas, das Erweiterungsmodule normalerweise nicht haben. Sie erhalten einen "Kein-Code-Objekt" -Fehler (zum Beispiel nach dem Erstellen und Installieren Ihrer .so von Cython, wie my_file.so, versuchen Sie es einfach mit python -m my_file).

Für den Fall # 2 bietet das runcython Projekt auch makecython, was eine große Vereinfachung für den Multi-File, Distutils-basierten Ansatz darstellt, auf den allgemein zurückgegriffen wird. Nachdem Sie also runcython verwendet haben, um mit dem Code herumzuspielen, können Sie makecython für den legitimen Build- und Bereitstellungsteil verwenden.

Dies ist immer noch eine neue Bibliothek, also ich empfehle es nicht, wenn Sie über eine reale Welt, Produktionsabhängigkeit oder etwas reden. Für diesen Fall wird pyximport immer noch besser sein.

Aber für schnelle und schmutzige Arbeit, wo Sie nur ein .pyx Erweiterungsmodul aufrufen möchten, als wäre es ein generisches Modul, ist runcython eine bequeme Wahl.