Zasadniczo, gdy mam plik Pythona, taki jak:
python-code.py
I użyć:
import (python-code)
interpreter podaje mi błąd składniowy.
Jakieś pomysły, jak to naprawić? Czy myślniki są niedozwolone w nazwach plików Pythona?
Zasadniczo, gdy mam plik Pythona, taki jak:
python-code.py
I użyć:
import (python-code)
interpreter podaje mi błąd składniowy.
Jakieś pomysły, jak to naprawić? Czy myślniki są niedozwolone w nazwach plików Pythona?
Odpowiedzi:
Powinieneś sprawdzić PEP 8 , przewodnik po stylu dla kodu w języku Python:
Nazwy pakietów i modułów Moduły powinny mieć krótkie nazwy składające się wyłącznie z małych liter. Podkreślenia mogą być używane w nazwie modułu, jeśli poprawia to czytelność. Pakiety Pythona powinny również mieć krótkie nazwy składające się wyłącznie z małych liter, chociaż odradza się stosowanie podkreślenia.
Ponieważ nazwy modułów są mapowane na nazwy plików, a niektóre systemy plików nie uwzględniają wielkości liter i obcinają długie nazwy, ważne jest, aby nazwy modułów były dość krótkie - nie będzie to problem w systemie Unix, ale może to być problem, gdy kod jest transportowany do starszych wersji Mac, Windows lub DOS.
Innymi słowy: zmień nazwę pliku :)
ops-scripts
i wiedzieć, że nie można ich zaimportować przy użyciu normalnego podejścia do przestrzeni nazw pakietu. Można też nazwać pojedynczy skrypt stop-website.py
dla podobnego efektu. Każdy z nich można nadal importować przy użyciu runpy
i innych metod, ale pomaga to uniknąć niektórych typowych błędów.
cgi-bin
folderze (robię na nich unitttesty), co jest dość standardowym afaikiem. Jeśli nie masz tak rzadkiego przypadku, zdecydowanie zmień nazwę modułu, jeśli masz nad nim kontrolę.
Inną rzeczą, na którą należy zwrócić uwagę w kodzie, jest to, że import nie jest funkcją. Więc import(python-code)
powinno być to, import python-code
co, jak niektórzy już wspominali, jest interpretowane jako „import pythona bez kodu”, a nie to, co zamierzałeś. Jeśli naprawdę potrzebujesz zaimportować plik z myślnikiem w nazwie, możesz wykonać następujące czynności:
python_code = __import__('python-code')
Ale, jak wspomniano powyżej, nie jest to zalecane. Powinieneś zmienić nazwę pliku, jeśli jest to coś, co kontrolujesz.
TLDR
Kreski nie są nielegalne, ale nie powinieneś ich używać z 3 powodów:
Jeśli zdecydowanie musisz zaimportować nazwę pliku z myślnikiem, specjalna składnia jest następująca:
module_name = __import__('module-name')
Ciekawi Cię, dlaczego potrzebujemy specjalnej składni?
Powodem specjalnej składni jest to, że kiedy piszesz import somename
, tworzysz obiekt modułu z identyfikatorem somename
(więc możesz go później użyć np somename.funcname
.). Oczywiście module-name
nie jest to poprawny identyfikator, stąd specjalna składnia, która daje prawidłowy identyfikator.
Nie rozumiesz, dlaczego nazwa modułu nie jest prawidłowym identyfikatorem?
Nie martw się - ja też nie. Oto wskazówka, aby pomóc: Spójrz na tej linii Pythona: x=var1-var2
. Czy widzisz odejmowanie po prawej stronie przypisania lub nazwę zmiennej z myślnikiem?
PS
W mojej odpowiedzi nie ma nic oryginalnego, z wyjątkiem umieszczenia w jednym miejscu tego, co uważam za najbardziej odpowiednie fragmenty informacji ze wszystkich innych odpowiedzi
psycopg2_binary = import_module('psycopg2-binary')
. Błąd => ModuleNotFoundError: No module named 'psycopg2-binary'
. Ale psycopg2-binary
jest zainstalowany. Nie mam pojęcia, jak to uwzględnić.
Problem w tym, że python-code
nie jest to identyfikator. Parser widzi to jako python
minus code
. Oczywiście to nie zrobi tego, o co prosisz. Będziesz musiał użyć nazwy pliku, która jest również prawidłowym identyfikatorem Pythona. Spróbuj zastąpić -
znak podkreśleniem.
Prawdopodobnie mógł zaimportować go przez jakiś __import__
hack, ale jeśli jeszcze nie wiem jak, nie należy. Nazwy modułów w Pythonie powinny być poprawnymi nazwami zmiennych („identyfikatorami”) - oznacza to, że jeśli masz moduł foo_bar
, możesz go używać z poziomu Python ( print foo_bar
). Nie byłbyś w stanie tego zrobić z dziwną nazwą ( print foo-bar
-> błąd składni).
W Pythonie 3 użyj import_module :
from importlib import import_module
python_code = import_module('python-code')
Bardziej ogólnie,
import_module('package.subpackage.module')
Chociaż prawidłowe nazewnictwo plików jest najlepszym rozwiązaniem, jeśli python-code
nie jest to pod naszą kontrolą, hackowanie __import__
jest lepsze niż kopiowanie, zmiana nazwy lub inne manipulowanie kodem innych autorów. Jednak spróbowałem i nie zadziałało, chyba że zmieniłem nazwę pliku, dodając .py
rozszerzenie. Po przejrzeniu dokumentu w celu uzyskania opisu .py
, skończyło się na tym:
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()
Utworzył nowy plik python-codec
przy pierwszym uruchomieniu.