Ist es in Ordnung, Bindestriche in Python-Dateien zu verwenden, wenn Sie versuchen, sie zu importieren?

149

Grundsätzlich, wenn ich eine Python-Datei habe wie:

python-code.py

und verwenden:

import (python-code)

Der Interpreter gibt mir einen Syntaxfehler.

Irgendwelche Ideen, wie man das Problem beheben kann? Sind Bindestriche in Python-Dateinamen unzulässig?

Joan Venge
quelle

Antworten:

167

Sie sollten sich PEP 8 , den Style Guide für Python-Code, ansehen:

Paket- und Modulnamen Module sollten kurze Namen in Kleinbuchstaben haben. Unterstriche können im Modulnamen verwendet werden, wenn dies die Lesbarkeit verbessert. Python-Pakete sollten auch kurze Namen in Kleinbuchstaben enthalten, obwohl von der Verwendung von Unterstrichen abgeraten wird.

Da Modulnamen Dateinamen zugeordnet werden und bei einigen Dateisystemen die Groß- und Kleinschreibung nicht berücksichtigt wird und lange Namen abgeschnitten werden, ist es wichtig, dass die Modulnamen relativ kurz gewählt werden - dies ist unter Unix kein Problem, kann aber ein Problem sein Problem, wenn der Code zu älteren Mac- oder Windows-Versionen oder DOS transportiert wird.

Mit anderen Worten: Benennen Sie Ihre Datei um :)

Paolo Bergantino
quelle
75
das Problem nichts mit Stil zu tun hat, ist es ein Syntaxfehler
4
Wie unten gezeigt, ist es möglich, noch eine Datei mit diesem Namen zu haben, daher ist der Styleguide sehr relevant.
Paolo Bergantino
5
Es kann sehr hilfreich sein, Bindestriche in Python-Verzeichnis- und Dateinamen zu verwenden, wenn Sie Importe ausdrücklich verhindern möchten. In einem Django-Projekt können beispielsweise Skripte in Python geschrieben sein, die nicht als Anwendungen adressierbar sein sollten. Sie können diese in einen Ordner wie legen ops-scriptsund wissen, dass sie nicht mit einem normalen Paket-Namespace-Ansatz importiert werden können. Oder ein einzelnes Skript könnte stop-website.pyfür einen ähnlichen Effekt benannt werden. Alle diese runpyMethoden können natürlich weiterhin über und einige andere Methoden importiert werden , dies hilft jedoch dabei, einige häufige Fehler zu vermeiden.
Chris Johnson
Das Umbenennen eines Moduls kann problematisch sein, insbesondere wenn Sie sich auf einen anderen Standard verlassen. In meinem Fall verwende ich Python-CGI-Dateien im cgi-binOrdner (mache Unitttests für sie), was ziemlich normal ist. Wenn Sie keinen seltenen Fall wie diesen haben, benennen Sie Ihr Modul definitiv um, wenn Sie die Kontrolle darüber haben.
NuclearPeon
1
Ich habe gerade festgestellt, dass PyDev Verzeichnisnamen mit Bindestrichen zulässt, jedoch nicht die Klassen und / oder internen Variablen in den .py-Dateien anzeigt, die in diesem Verzeichnis enthalten sind.
user5920660
122

Eine andere Sache, die Sie in Ihrem Code beachten sollten, ist, dass der Import keine Funktion ist. So import(python-code)sollte es sein, import python-codewas, wie einige bereits erwähnt haben, als "Python minus Code importieren" interpretiert wird, nicht das, was Sie beabsichtigt haben. Wenn Sie wirklich eine Datei mit einem Bindestrich im Namen importieren müssen, können Sie Folgendes tun:

python_code = __import__('python-code')

Wie oben ebenfalls erwähnt, wird dies jedoch nicht wirklich empfohlen. Sie sollten den Dateinamen ändern, wenn Sie ihn steuern.

Rick Copeland
quelle
@ KevinAudleman Haben Sie ein funktionierendes Beispiel für die Verwendung von import lib mit einer Datei mit Bindestrich? Ich habe es versucht und bin gescheitert.
Tom Hale
@TomHale importlib.import_module ('abmodule-1') sollte funktionieren. Wenn Ihr import_module nicht funktioniert, funktioniert ein normaler Import meiner Meinung nach auch nicht.
Ian Lin
63

TLDR

Bindestriche sind nicht illegal, aber Sie sollten sie aus drei Gründen nicht verwenden:

  1. Sie benötigen eine spezielle Syntax, um Dateien mit Bindestrichen zu importieren
  2. Niemand erwartet einen Modulnamen mit einem Bindestrich
  3. Es ist gegen die Empfehlungen des Python Style Guide

Wenn Sie definitiv einen Dateinamen mit einem Bindestrich importieren müssen, lautet die spezielle Syntax wie folgt:

module_name = __import__('module-name')

Neugierig, warum wir spezielle Syntax brauchen?

Der Grund für die spezielle Syntax ist, dass Sie beim Schreiben import somenameein Modulobjekt mit einem Bezeichner erstellen somename(damit Sie es später mit zsomename.funcname . ). Natürlich module-nameist kein gültiger Bezeichner und daher die spezielle Syntax, die einen gültigen Bezeichner ergibt.

Sie verstehen nicht, warum der Modulname keine gültige Kennung ist?

Mach dir keine Sorgen - ich auch nicht. Hier ist ein Tipp, der Ihnen helfen soll: Sehen Sie sich diese Python-Zeile an:x=var1-var2 . Sehen Sie eine Subtraktion auf der rechten Seite der Zuweisung oder einen Variablennamen mit einem Bindestrich?

PS

Meine Antwort enthält nichts Originelles, außer das, was ich als die relevantesten Informationen aus allen anderen Antworten an einem Ort angesehen habe

ndemou
quelle
Ich versuche, mit diesem Import ein Pip-Paket mit einem Bindestrich zu importieren. psycopg2_binary = import_module('psycopg2-binary'). Fehler => ModuleNotFoundError: No module named 'psycopg2-binary'. Ist psycopg2-binaryaber installiert. Keine Ahnung, wie man es einbindet.
Mote Zart
Vielleicht ist es ein Pfadproblem. Schauen Sie sich chrisyeh96.github.io/2017/08/08/…
ndemou
32

Das Problem ist, dass python-codees sich nicht um eine Kennung handelt. Der Parser sieht dies als pythonMinus code. Natürlich wird dies nicht das tun, was Sie verlangen. Sie müssen einen Dateinamen verwenden, der auch eine gültige Python-ID ist. Versuchen Sie, das -durch einen Unterstrich zu ersetzen .

SingleNegationElimination
quelle
4
+1. Ich hätte nie gedacht, dass der Dateiname des Python-Quellcodes eine gültige Kennung sein sollte, da der Dateiname verwendet wird, um auf das Modulobjekt zu verweisen.
Andy
5

Sie könnten es wahrscheinlich durch einen __import__Hack importieren , aber wenn Sie noch nicht wissen wie, sollten Sie es nicht tun. Python-Modulnamen sollten gültige Variablennamen ("Bezeichner") sein. Wenn Sie also ein Modul haben foo_bar, können Sie es in Python ( print foo_bar) verwenden. Mit einem seltsamen Namen ( print foo-bar-> Syntaxfehler) wäre dies nicht möglich .

John Millikin
quelle
5

Verwenden Sie unter Python 3 import_module :

from importlib import import_module
python_code = import_module('python-code')

Allgemeiner,

import_module('package.subpackage.module')
e18r
quelle
1

Obwohl die richtige Benennung von Dateien der beste Weg ist, python-codeist eine Hack-Verwendung __import__besser, als den Code anderer Autoren zu kopieren, umzubenennen oder auf andere Weise herumzuspielen , wenn er nicht unter unserer Kontrolle steht . Ich habe es jedoch versucht und es hat nicht funktioniert, es sei denn, ich habe die Datei umbenannt und die .pyErweiterung hinzugefügt . Nachdem ich mir das Dokument angesehen hatte , um eine Beschreibung für zu erhalten .py, kam ich zu folgendem Ergebnis:

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

Beim python-codecersten Durchlauf wurde eine neue Datei erstellt .

Ale
quelle