2016-09-09 2 views
3

Ich bin neu in Python. Ich benutze die Anaconda 4.1.1 (Python 3.5.2) Distribution auf Ubuntu. Ich fing an, an einem Projekt zu arbeiten, das cx_Oracle verwendet. O könnte natürlich cx_Oracle mit pip installieren.Getting cx_Oracle mit korrektem Fall mit conda

pip install cx_Oracle 

Aber jeder scheint zu sagen, dass Anacondaâs conda ist ein viel besserer Paket-Manager, Manager virtuelle Umgebung und die Abhängigkeit Manager, dass pip und virtualenv zusammen. Ich würde es vorziehen, einfach conda zu verwenden, um alles zu verwalten.

Also habe ich eine requirements.txt Datei (einige meiner Teamkollegen werden immer noch mit pip und virtualenv) mit der folgenden Zeile. (Ich möchte Python Unterstützung 3.5, also muss ich cx_Oracle 5.2.1, die aktuelle neueste.)

cx_Oracle==5.2.1 

Dann sage ich conda eine virtuelle Umgebung foobar zu erstellen:

conda create -n foobar --file requirements.txt 

Dies scheitert; leider cx_Oracle 5.2.1 ist noch nicht im Continuum conda Repository (obwohl das halbe Jahr seit seiner Veröffentlichung vergangen ist). Es gibt jedoch mehrere Kanäle (z.B. mgckind), die vorgeben, Version 5.2.1 zu liefern. Es gibt nur ein Problem: Alle Kanäle liefern cx_oracle und nicht cx_Oracle (beachten Sie die Falldifferenz). So wird dies nicht funktionieren:

conda create -n foobar -c mgckind --file requirements.txt 

Auch wenn ich über einen Kanal, wie im Beispiel angeben, und obwohl requirements.txt deutlich cx_Oracle sagt conda nach unten bringt cx_oracle mit einem Klein o. Da bei Python-Modulimports die Groß-/Kleinschreibung beachtet wird, schlagen alle meine Tests fehl, da sie cx_Oracle nicht mit einem Großbuchstaben O finden können.

Fehle ich etwas einfach hier, weil ich Python neu bin? Oder ist Anaconda wirklich beides hinter den Zeiten und inkompatibel mit cx_Oracle, was bedeutet, dass ich pip install verwenden und es von PyPI herunterbringen muss?

Wenn es wirklich einen Fallunterschied gibt, ist diese Situation auf Conda vs PiPY üblich? Ist es eine Conda-Richtlinie, Dinge nur in Kleinbuchstaben zu benennen? Wie gehen andere mit der Diskrepanz um?

+0

Können Sie das Modul überhaupt importieren? Wenn ja, haben Sie versucht, 'import cx_Oracle' zu ​​ändern, um 'cx_oracle als cx_Oracle' zu importieren? – Abdou

+0

Ich habe nicht versucht, den Code zu ändern. Offensichtlich ist dies ein letzter Ausweg, aber es vermeidet das Problem. Meine Kollegen benutzen pip, wie ich bereits erwähnt habe --- wird der Code kaputt gehen, wenn ich ihn ändere, aber dann downloaden sie 'cx_Oracle' mit' pip'? –

+0

Verwendung Ausnahmebehandlung: 'versuchen: Import cx_Oracle außer Import: Import cx_Oracle als cx_Oracle' – Abdou

Antwort

1

Das Problem hatte nichts mit dem Kleinbuchstaben-Paketnamen auf Continuums Conda-Repository zu tun. Tatsächlich habe ich etwas verpasst. Ich hatte eine neue virtuelle Umgebung geschaffen, wie ich in der Frage erwähnt:

conda create -n foobar --file requirements.txt 

Die Anforderungen Datei cx_Oracle==5.2.1 enthalten, die ich auch erwähnt.Aber was ich tat nicht Erwähnung ist, dass ich dann das Programm mit nosetests getestet, und die requirements.txt Datei tat nicht enthalten nose! Dies bedeutet, dass die Komponententests von der Standardanaconda-Installation nose ausgeführt wurden, die keine Kenntnis von cx_Oracle hatte, die nicht in der Hauptanaconda-Installation installiert war. (Die virtuelle Umgebung hatte Python 3.4 aufgrund von Abhängigkeitsproblemen heruntergerissen, während die Anaconda-Installation Python 3.5 verwendete.)

In jedem Fall war das Problem, dass ich versehentlich nose von der Standardinstallation von Anaconda verwendete, nicht aus meiner virtuellen Umgebung. Die cx_oracle installiert in meiner virtuellen Umgebung, wie kalefranz wies darauf hin, erfordert import cx_Oracle unabhängig von der Groß- und Kleinschreibung des Paketnamens.

Sobald ich nose in meiner virtuellen Umgebung installiert habe, funktionierte nosetests, weil es die cx_oracle Installation abholte.

Zusammengefasst folgend scheint das Paket/Modulgehäuse Situation in der Python-Welt zu sein:

  • Python Modul importiert Fall empfindlich sind.
  • Bei Paketnamen wird die Groß-/Kleinschreibung nicht beachtet.
  • Der neue Best Practices-Ansatz besteht darin, Kleinbuchstaben in Paketnamen zu verwenden.
  • Das PyPI-Repository behält den Fall bei; Das Continuum Conda-Repository konvertiert Paketnamen in Kleinbuchstaben.
  • Unabhängig davon, ob man ein Paket aus PyPI oder Continuum conda holt, und unabhängig davon, welcher Paketfall zum Abrufen verwendet wird, sollte der Modulname und die entsprechende Importanweisung im Code den von der Bibliothek verwendeten offiziellen Fall beibehalten.
1

Der conda Paketname hat keinen Einfluss darauf, wie Ihr import den Code in Python. Mit Blick auf das Linux-64-Paket here zum Beispiel, während der Paketname ist cx_oracle zu Conda Ökosystem-Standards entsprechen, müssen Sie in Python importieren Sie dieses Paket mit import cx_Oracle. Es gibt viele Beispiele für Python-Pakete in PyPI, bei denen der Paketname anders ist als die Art, in der das Paket in Python-Code importiert wird. Nur eine dieser Python-Macken, schätze ich.

+0

Nun, das ist wirklich eine gute Nachricht. Aber ich könnte fast schwören, dass, wenn ich die neueste Version von dem Conda 'mgckind'-Kanal heruntergeladen habe, das Programm' cx_Oracle' nicht finden konnte, als es es importierte. Könnte es sein, dass einer der Kanäle den Importnamen ändert? Ich bin neu in Python, also muss ich zurückgehen und mir die Details ansehen, um zu sehen, was das Problem verursacht hat. Ich hoffe, du hast Recht! –

+0

Sie haben Recht! Vielen Dank, dass du mir das gesagt hast; Sie bringen mich auf den richtigen Weg über das wahre Problem. Es stellt sich heraus, dass 'nosetests' nicht das' cx_oracle' in meiner virtuellen Umgebung verwendet; Siehe meine separate Antwort. Das Problem hatte überhaupt nichts mit dem Gehäuse zu tun. –

Verwandte Themen