Як імпортувати модуль, коли в назві модуля є тире "або" дефіс?


195

Я хочу імпортувати foo-bar.py. Це працює:

foobar = __import__("foo-bar")

Це не так:

from "foo-bar" import *

Моє запитання: Чи є спосіб, щоб я міг використовувати вищевказаний формат, тобто from "foo-bar" import *імпортувати модуль, який має -в ньому?


10
Чому у вас є модуль з тире в його назві?
Матті Вірккунен

23
Я здогадуюсь, що він спочатку був написаний як сценарій, а не як модуль.
Майкл Гофман


@MattiVirkkunen makepy.py win32com генерує модуль з тире в ньому. занадто погано. comtypes вирішили це, перетворивши його на підкреслення
swdev

2
@MattiVirkkunen Я думаю, що Python не повинен обмежувати імена, які я можу дати своїм каталогам. Це не є його обов'язком.
Зельфір Кальтшталь

Відповіді:


117

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

Редагувати: Якщо importце не ваша мета (як, наприклад, вам не байдуже, що з цим відбувається sys.modules, вам не потрібно це імпортувати), просто отримавши всі глобальні файли у свій власний обсяг, ви можете використовуватиexecfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 

24
Python 3.x Що нового в Python 3.0 Видалено execfile (). Замість execfile(fn)використання exec(open(fn).read())Також є пакет importlib.
DevPlayer

106

Якщо ви не можете перейменувати модуль, щоб він відповідав умовам іменування Python, створіть новий модуль, щоб діяти як посередник:

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

 ---- main.py ----
 from foo_proxy import * 

30
Я б ніколи цього не реалізував. Але я не можу дати +1 за велику яскравість цього хака
inspectorG4dget

11
ви могли б на самому ділі зробити це без foo_proxy.pyфайлу, призначте вихід __import__(...)до sys.modules['foo_proxy']. Насправді, не робіть цього, це жахлива ідея.
SingleNegationElimination

3
Класно просто те, що я шукав. Якщо ви користуєтесь нативними бібліотеками, які постачаються з дистрибутивом, існує корисна скринька.
Свен


46

Якщо ви не можете перейменувати оригінальний файл, ви також можете використати символьне посилання:

ln -s foo-bar.py foo_bar.py

Тоді ви можете просто:

from foo_bar import *

2

Як і інші сказані, ви не можете використовувати "-" в іменуванні python, існує багато обхідних шляхів, один такий спосіб вирішення корисний, якщо вам доведеться додати кілька модулів із шляху, який використовується sys.path

Наприклад, якщо ваша структура така:

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

import barfoo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.