В основном, когда у меня есть файл Python, например:
python-code.py
и используйте:
import (python-code)
интерпретатор дает мне синтаксическую ошибку.
Есть идеи, как это исправить? Являются ли дефисы незаконными в именах файлов Python?
В основном, когда у меня есть файл Python, например:
python-code.py
и используйте:
import (python-code)
интерпретатор дает мне синтаксическую ошибку.
Есть идеи, как это исправить? Являются ли дефисы незаконными в именах файлов Python?
Ответы:
Вам следует ознакомиться с PEP 8 , Руководством по стилю для кода Python:
Имена пакетов и модулей. Модули должны иметь короткие имена в нижнем регистре. Подчеркивание можно использовать в имени модуля, если это улучшает читаемость. Пакеты Python также должны иметь короткие имена, написанные строчными буквами, хотя использование подчеркиваний не рекомендуется.
Поскольку имена модулей сопоставляются с именами файлов, а некоторые файловые системы нечувствительны к регистру и обрезают длинные имена, важно, чтобы имена модулей были достаточно короткими - это не будет проблемой в Unix, но может быть проблема, когда код переносится на старые версии Mac, Windows или DOS.
Другими словами: переименуйте файл :)
ops-scripts
и знать, что они не могут быть импортированы с использованием обычного подхода к пространству имен пакетов. Или один сценарий может быть назван stop-website.py
для аналогичного эффекта. runpy
Конечно, любой из них можно импортировать с помощью и некоторыми другими методами, но это помогает избежать некоторых распространенных ошибок.
cgi-bin
папке (выполняя для них unitttests), что довольно стандартно для afaik. Если у вас нет такого редкого случая, обязательно переименуйте свой модуль, если вы контролируете его.
Еще одна вещь, которую следует отметить в вашем коде, заключается в том, что импорт не является функцией. Так import(python-code)
должно быть то, import python-code
что, как уже упоминалось, интерпретируется как «импорт python минус код», а не то, что вы намеревались. Если вам действительно нужно импортировать файл с тире в его имени, вы можете сделать следующее:
python_code = __import__('python-code')
Но, как уже упоминалось выше, это не рекомендуется. Вам следует изменить имя файла, если оно находится под вашим контролем.
TL; DR
Дефисы не являются незаконными, но вы не должны их использовать по трем причинам:
Если вам определенно нужно импортировать имя файла с дефисом, специальный синтаксис следующий:
module_name = __import__('module-name')
Интересно, зачем нам нужен особый синтаксис?
Причина использования специального синтаксиса заключается в том, что при написании import somename
вы создаете объект модуля с идентификатором somename
(чтобы позже вы могли использовать его, например somename.funcname
). Конечно, module-name
это недействительный идентификатор и, следовательно, специальный синтаксис, который дает действительный идентификатор.
Вы не понимаете, почему имя модуля не является допустимым идентификатором?
Не волнуйтесь - я тоже. Вот подсказка , чтобы помочь вам: Посмотрите на эту питона линии: x=var1-var2
. Вы видите вычитание справа от присваивания или имя переменной с тире?
PS
В моем ответе нет ничего оригинального, за исключением включения того, что я считал наиболее актуальной информацией из всех других ответов в одном месте
psycopg2_binary = import_module('psycopg2-binary')
. Ошибка => ModuleNotFoundError: No module named 'psycopg2-binary'
. Но psycopg2-binary
установлен. Не знаю, как это включить.
Проблема в том, что python-code
это не идентификатор. Парсер видит в этом python
минус code
. Конечно, это не поможет. Вам нужно будет использовать имя файла, которое также является допустимым идентификатором Python. Попробуйте заменить -
символ подчеркивания.
Вы, вероятно, могли бы импортировать его с помощью какого-нибудь __import__
взлома, но если вы еще не знаете, как, вам не следует этого делать. Имена модулей Python должны быть допустимыми именами переменных («идентификаторами») - это означает, что если у вас есть модуль foo_bar
, вы можете использовать его из Python ( print foo_bar
). Вы не смогли бы сделать это со странным именем ( print foo-bar
-> синтаксическая ошибка).
В Python 3 используйте import_module :
from importlib import import_module
python_code = import_module('python-code')
В более общем смысле,
import_module('package.subpackage.module')
Хотя правильное именование файлов - лучший вариант, если python-code
это не находится под нашим контролем, использование взлома __import__
лучше, чем копирование, переименование или иным образом возиться с кодом других авторов. Однако я попытался, и это не сработало, если я не переименовал файл, добавив .py
расширение. Посмотрев на документ, чтобы узнать, как получить описание .py
, я пришел к следующему:
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()
Он создал новый файл python-codec
при первом запуске.