В основном, когда у меня есть файл python, например:
python-code.py
и используйте:
import (python-code)
интерпретатор дает мне синтаксическую ошибку.
Любые идеи о том, как это исправить? Имеются ли запреты в именах файлов python?
В основном, когда у меня есть файл python, например:
python-code.py
и используйте:
import (python-code)
интерпретатор дает мне синтаксическую ошибку.
Любые идеи о том, как это исправить? Имеются ли запреты в именах файлов python?
Вы должны проверить PEP 8, Руководство по стилю для кода Python:
Модули модулей пакетов и модулей должны иметь короткие имена всех строчных букв. Подчеркивания могут использоваться в имени модуля, если это улучшает читаемость. Пакеты Python также должны иметь короткие имена всех строчных букв, хотя использование подчеркиваний не рекомендуется.
Так как имена модулей сопоставляются с именами файлов, а некоторые файловые системы не чувствительны к регистру и обрезают длинные имена, важно, чтобы имена модулей были достаточно короткими - это не будет проблемой для Unix, но это может быть проблемой, когда код переносится на старые версии для Mac или Windows или DOS.
Другими словами: переименуйте свой файл:)
Еще одна вещь, которая стоит отметить в вашем коде, заключается в том, что импорт не является функцией. Поэтому import(python-code)
должен быть import python-code
, который, как уже отмечалось, интерпретируется как "import python минус-код", а не то, что вы намеревались. Если вам действительно нужно импортировать файл с тире в его имени, вы можете сделать следующее::
python_code = __import__('python-code')
Но, как упоминалось выше, это не рекомендуется. Вы должны изменить имя файла, если оно что-то контролирует.
TL;DR
Черточки не являются незаконными, но вы не должны использовать их по 3 причинам:
Если вам определенно необходимо импортировать имя файла с тире, специальный синтаксис такой:
module_name = __import__('module-name')
Любопытно, почему нам нужен специальный синтаксис?
Причиной особого синтаксиса является то, что когда вы пишете import somename
вы создаете объект модуля с идентификатором somename
(чтобы позже вы могли использовать его, например, с somename.funcname
). Конечно, module-name
не является допустимым идентификатором и, следовательно, специальным синтаксисом, который дает правильный.
Вы не понимаете, почему имя модуля не является допустимым идентификатором?
Не волнуйся, я тоже. Вот подсказка, чтобы помочь вам: Посмотрите на эту строку Python: x=var1-var2
. Вы видите вычитание справа от присваивания или имя переменной с тире?
PS
Ничего оригинального в моем ответе, кроме того, что я считаю наиболее релевантной информацией из всех других ответов в одном месте
Проблема заключается в том, что 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
при первом запуске.