В основном, когда у меня есть файл 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
при первом запуске.источник