В python, как импортировать имя файла начинается с числа


84

В основном существует файл с именем, 8puzzle.pyи я хочу импортировать файл в другой файл (в той же папке, и я не могу изменить имя файла, поскольку файл предоставлен). Есть ли способ сделать это в Python? Пробовал обычным способом from 8puzzle import *, выдает ошибку.

Ошибка:

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>> 

12
Почему люди говорят: «Это выдает [] ошибку», а затем не публикуют, в чем заключается ошибка?
Джон Цвинк 01

7
@JohnZwinck Это синтаксическая ошибка. Я предполагаю, потому что «8puzzle» не является допустимым идентификатором (он начинается с числа), а синтаксис оператора импорта предполагает наличие идентификатора Python. Что привело бы к ответу: «Нет, вы не можете. Переименуйте модуль во что-нибудь, начинающееся с буквы или символа подчеркивания».
millimoose 01

Я буду иметь в виду, что Джон сделал хорошее замечание. И спасибо, Abhijeet добавил сообщение об ошибке для меня. Благодарю.
Саймон Гуо

1
Переименовать 8puzzle.pyв puzzle8.pyи использование import puzzle8.
Bakuriu

Ответы:


96

Ты мог бы сделать

puzzle = __import__('8puzzle')

Очень интересная проблема. Я не забуду не называть ничего цифрой.

Если хотите import *- прочтите этот вопрос и ответьте .


1
работает отлично! Благодарю. да, я бы не назвал его начинающимся с числа, но это раздаточный файл с заданиями на курс, поэтому я не могу изменить его. Но, похоже, это не имеет значения, поскольку у нас уже есть решение для этого. Еще раз спасибо.
Саймон Гуо

4
Помогите спасти мир или хотя бы своих одноклассников. Если вам вручили невозможный импорт, сообщите об этом инструктору. Да, иногда они ненавидят ошибаться, но если у вас возникла эта проблема, то же самое и со всеми остальными, и хотя этот ответ работает, это неправильное решение (если только класс не является «Обфусцированный Python 101»).
msw 01

1
Лучший способ (по крайней мере, с python 2.7) - использовать модуль importlib: puzzle = importlib.import_module ('8puzzle')
Седрик

3
На самом деле для этого есть хороший вариант использования - в рамках процесса компиляции / производства объединение модулей Python вместе проще всего, если они названы в лексиграфической форме (обычно это не имеет значения, но константы и импорт вверху, если имя 'внизу, поэтому несколько модулей, начинающихся с' 0 ', могут быть полезны.) Также полезно при отладке такой необычной структуры каталогов в сочетании с inotify или watch, что-то вроде: watch -n .1' cat * | python ', который будет загружать ваше приложение python каждую десятую секунды (или, по крайней мере, как можно быстрее), или: cat $ (find. -name "* .py") | python
fatal_error

1
Поздно к вечеринке, но еще один вариант использования - импорт из миграций Alembic, поскольку все они начинаются со случайных хешей
kevlarr

35

Приведенные выше ответы верны, но на данный момент рекомендуется использовать import_moduleфункцию:

importlib.import_module(name, package=None)
Импортируйте модуль. Аргумент name указывает, какой модуль импортировать в абсолютном или относительном выражении (например, pkg.modили ..mod). Если имя указано в относительных терминах, то в качестве аргумента пакета должно быть установлено имя пакета, который должен действовать как якорь для разрешения имени пакета (например, import_module('..mod', 'pkg.subpkg')будет импортировать pkg.mod).

Функция import_module () действует как упрощающая оболочка importlib.__import__(). Это означает, что вся семантика функции получена из importlib.__import__(). Наиболее важное различие между этими двумя функциями заключается в том, что они import_module()возвращают указанный пакет или модуль (например pkg.mod), а __import__()возвращают пакет или модуль верхнего уровня (например pkg).

Если вы динамически импортируете модуль, который был создан после того, как интерпретатор начал выполнение (например, создал исходный файл Python), вам может потребоваться вызвать, invalidate_caches()чтобы новый модуль был замечен системой импорта.

__import__ сейчас не рекомендуется.

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
Реализация встроенной __import__()функции.

Примечание. import_module()Вместо этой функции следует использовать программный импорт модулей .


Это работает, спасибо, но не работает, чтобы импортировать функцию или переменную в один из этих файлов, начиная с числа. Если я сделаю:, an_imported_file = importlib.import_module('13_file')тогда я не смогу from an_imported_file import var_x. Что можно сделать для этого?
Мартин

/usr/local/bin/python3.7 "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py" Traceback (most recent call last): File "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py", line 7, in <module> from an_imported_file import var_x ModuleNotFoundError: No module named 'an_imported_file'
Мартин

Кроме того, строка `from an_imported_file import var_x` в Pycharm подчеркнута красным ...
Мартин

Я не знаю, извините. Мой общий совет - избегать этого.
laike9m 03

0

Не используйте .pyрасширение при импорте.

Работает from 8puzzle import *?

Как бы то ни было, from x import *он не является предпочтительным шаблоном Python, поскольку он вводит пространство имен этого модуля в ваш текущий контекст.

В общем, попробуйте импортировать именно то, что вам нужно, из этого модуля. Любой глобал из другого модуля может быть импортирован.

например, если у вас есть, 8puzzle.fooвы можете сделать `from 8puzzle import

Редактировать:

Хотя мое .pyсообщение верное, этого недостаточно.

Предложение другого автора __import__('8puzzle')верно. Однако я настоятельно рекомендую избегать этого шаблона .

Во-первых, он зарезервировал внутренний частный метод Python. По сути, вы нарушаете фундаментальные предположения о том, что значит иметь возможность импортировать модуль. Простое переименование файла во что-нибудь другое, например puzzle8, исправит это.

Это ужасно расстроит опытных программистов Python, которые ожидают, что они будут знать, что ваш импорт находится на вершине, и ожидают, что код (попытается) соответствовать PEP8 .


1
извините за запутанность. Я сделал from 8puzzle import *и отредактировал свой первоначальный вопрос. И это не работает, как сказал Мванвин.
Саймон Гуо

Это моя беда. Я забыл, что имена файлов модулей не могут начинаться с номера. Я опубликовал правку.
mvanveen 01
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.