Как импортировать модуль, если в имени модуля есть дефис или дефис? - PullRequest
144 голосов
/ 02 декабря 2011

Я хочу импортировать foo-bar.py. Это работает:

foobar = __import__("foo-bar")

Это не:

from "foo-bar" import *

Мой вопрос: есть ли способ использовать вышеуказанный формат, то есть from "foo-bar" import *, чтобы импортировать модуль, в котором есть -?

Ответы [ 5 ]

100 голосов
/ 02 декабря 2011

ты не можешь.foo-bar не является идентификатором.переименуйте файл в foo_bar.py

Редактировать: Если import не ваша цель (как в: вам все равно, что происходит с sys.modules, вам не нужноимпортировать сам), просто перенеся все глобальные переменные файла в свою область видимости, вы можете использовать execfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 
88 голосов
/ 02 декабря 2011

Если вы не можете переименовать модуль в соответствии с соглашениями об именах Python, создайте новый модуль, выступающий в качестве посредника:

 ---- foo_proxy.py ----
 tmp = __import__('foo-bar')
 globals().update(vars(tmp))

 ---- main.py ----
 from foo_proxy import * 
45 голосов
/ 09 января 2014

Если вы не можете переименовать исходный файл, вы также можете использовать символическую ссылку:

ln -s foo-bar.py foo_bar.py

Тогда вы можете просто:

from foo_bar import *
32 голосов
/ 28 ноября 2018

Начиная с Python 3.1, вы можете использовать importlib:

import importlib  
foobar = importlib.import_module("foo-bar")

(https://docs.python.org/3/library/importlib.html)

1 голос
/ 11 апреля 2019

Как и другие говорили, что вы не можете использовать "-" в именовании Python, есть много обходных путей, один из таких обходных путей, который был бы полезен, если вам пришлось добавить несколько модулей из пути, использует sys.path

Например, если ваша структура выглядит следующим образом:

foo-bar
├── barfoo.py
└── __init__.py

import sys
sys.path.append('foo-bar')

import barfoo
...