È corretto utilizzare trattini nei file Python quando si tenta di importarli?


149

Fondamentalmente quando ho un file Python come:

python-code.py

e usa:

import (python-code)

l'interprete mi dà un errore di sintassi.

Qualche idea su come aggiustarlo? I trattini sono illegali nei nomi dei file Python?

Risposte:


167

Dovresti dare un'occhiata a PEP 8 , la Guida allo stile per Python Code:

Nomi dei pacchetti e dei moduli I moduli dovrebbero avere nomi brevi, tutti in minuscolo. I caratteri di sottolineatura possono essere utilizzati nel nome del modulo se migliora la leggibilità. I pacchetti Python dovrebbero anche avere nomi brevi, tutti in minuscolo, sebbene l'uso di caratteri di sottolineatura sia sconsigliato.

Poiché i nomi dei moduli sono associati ai nomi dei file e alcuni file system non fanno distinzione tra maiuscole e minuscole e troncano i nomi lunghi, è importante che i nomi dei moduli siano scelti in modo da essere abbastanza brevi - questo non sarà un problema su Unix, ma potrebbe essere un problema quando il codice viene trasportato a versioni precedenti di Mac o Windows o DOS.

In altre parole: rinomina il tuo file :)


75
il problema non ha nulla a che fare con lo stile, è un errore di sintassi

4
Come mostrato di seguito, è possibile avere ancora un file con questo nome, quindi la guida di stile è molto rilevante.
Paolo Bergantino,

5
Può essere molto utile utilizzare trattini nella directory Python e nei nomi dei file quando si desidera esplicitamente impedire le importazioni. Ad esempio in (diciamo) un progetto Django, potresti avere degli script scritti in Python che non dovrebbero essere indirizzabili come applicazioni. Puoi metterli in una cartella come ops-scriptse sapere che non possono essere importati usando un normale approccio al namespace del pacchetto. O un singolo script potrebbe essere nominato stop-website.pyper un effetto simile. Ognuno di questi potrebbe essere comunque importato tramite runpye alcuni altri metodi ovviamente, ma questo aiuta ad evitare alcuni errori comuni.
Chris Johnson,

Rinominare un modulo può essere problematico, soprattutto se si fa affidamento su un altro standard. Nel mio caso, sto usando i file CGI di Python nella cgi-bincartella (facendo unitttest su di essi), che è piuttosto standard. A meno che tu non abbia un caso raro come questo, rinomina sicuramente il tuo modulo se ne hai il controllo.
NuclearPeon

1
Ho appena scoperto che PyDev consentirà i nomi di directory con trattini, ma non mostrerà le classi e / o le variabili interne nei file .py contenuti in quella directory.
user5920660,

123

Un'altra cosa da notare nel codice è che l'importazione non è una funzione. Così import(python-code)dovrebbe essere quello import python-code, come alcuni hanno già accennato, interpretato come "import python meno codice", non quello che intendevi. Se hai davvero bisogno di importare un file con un trattino nel suo nome, puoi fare quanto segue:

python_code = __import__('python-code')

Ma, come già detto sopra, questo non è davvero raccomandato. Dovresti cambiare il nome del file se è qualcosa che controlli.


@KevinAudleman hai un esempio funzionante di utilizzo di import lib con un file sillabato? Ho provato e fallito.
Tom Hale,

@TomHale importlib.import_module ('abmodule-1') dovrebbe funzionare. Se il tuo import_module non funziona, penso che anche una normale importazione non funzionerà.
Ian Lin,

64

TLDR

I trattini non sono illegali ma non dovresti usarli per 3 motivi:

  1. È necessaria una sintassi speciale per importare file con trattini
  2. Nessuno si aspetta un nome di modulo con un trattino
  3. È contro i consigli della Python Style Guide

Se devi assolutamente importare un nome di file con un trattino, la sintassi speciale è questa:

module_name = __import__('module-name')

Sei curioso di sapere perché abbiamo bisogno di una sintassi speciale?

Il motivo della sintassi speciale è che quando scrivi import somenamecrei un oggetto modulo con identificativo somename(quindi puoi usarlo in seguito con essomename.funcname .). Naturalmente module-namenon è un identificatore valido e quindi la sintassi speciale che ne dà uno valido.

Non capisci perché il nome del modulo non è un identificatore valido?

Non preoccuparti, neanche io. Ecco un suggerimento per aiutarti: guarda questa linea di pitone:x=var1-var2 . Vedi una sottrazione sul lato destro del compito o un nome di variabile con un trattino?

PS

Nulla di originale nella mia risposta, tranne includere quelle che ho considerato le informazioni più rilevanti da tutte le altre risposte in un unico posto


Sto cercando di usare questo import un pacchetto pip con un trattino. psycopg2_binary = import_module('psycopg2-binary'). Errore => ModuleNotFoundError: No module named 'psycopg2-binary'. Ma psycopg2-binaryè installato. Non ho idea di come includerlo.
Mote Zart,

Forse è un problema di percorso. Guarda chrisyeh96.github.io/2017/08/08/…
ndemou

32

Il problema è che python-code non è un identificatore. Il parser vede questo come pythonmeno code. Naturalmente questo non farà ciò che stai chiedendo. Dovrai utilizzare un nome file che sia anche un identificatore python valido. Prova a sostituire il carattere -di sottolineatura.


4
+1. Non ho mai pensato che il nome del file del codice sorgente Python dovesse essere un identificatore valido, poiché il nome del file verrà utilizzato per fare riferimento all'oggetto modulo.
andy,

5

Probabilmente potresti importarlo tramite qualche __import__hack, ma se non sai già come, non dovresti. I nomi dei moduli Python devono essere nomi di variabili validi ("identificatori") - ciò significa che se si dispone di un modulo foo_bar, è possibile utilizzarlo da Python ( print foo_bar). Non saresti in grado di farlo con un nome strano ( print foo-bar-> errore di sintassi).


5

Su Python 3 usa import_module :

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

Più generalmente,

import_module('package.subpackage.module')

1

Sebbene la corretta denominazione dei file sia la strada migliore, se python-codenon è sotto il nostro controllo, usare un hack __import__è meglio che copiare, rinominare o manipolare in altro modo il codice di altri autori. Tuttavia, ho provato e non ha funzionato a meno che non abbia rinominato il file aggiungendo l' .pyestensione. Dopo aver esaminato il documento per ottenere come ottenere una descrizione .py, ho finito con questo:

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()

Ha creato un nuovo file python-codecal primo avvio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.