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?
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:
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 :)
ops-scripts
e sapere che non possono essere importati usando un normale approccio al namespace del pacchetto. O un singolo script potrebbe essere nominato stop-website.py
per un effetto simile. Ognuno di questi potrebbe essere comunque importato tramite runpy
e alcuni altri metodi ovviamente, ma questo aiuta ad evitare alcuni errori comuni.
cgi-bin
cartella (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.
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.
TLDR
I trattini non sono illegali ma non dovresti usarli per 3 motivi:
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 somename
crei un oggetto modulo con identificativo somename
(quindi puoi usarlo in seguito con essomename.funcname
.). Naturalmente module-name
non è 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
psycopg2_binary = import_module('psycopg2-binary')
. Errore => ModuleNotFoundError: No module named 'psycopg2-binary'
. Ma psycopg2-binary
è installato. Non ho idea di come includerlo.
Il problema è che python-code
non è un identificatore. Il parser vede questo come python
meno 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.
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).
Su Python 3 usa import_module :
from importlib import import_module
python_code = import_module('python-code')
Più generalmente,
import_module('package.subpackage.module')
Sebbene la corretta denominazione dei file sia la strada migliore, se python-code
non è 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' .py
estensione. 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-codec
al primo avvio.