Bagaimana cara mengimpor modul ketika nama modul memiliki tanda hubung '-' atau tanda hubung di dalamnya?

195

Saya ingin mengimpor foo-bar.py. Ini bekerja:

foobar = __import__("foo-bar")

Ini tidak:

from "foo-bar" import *

Pertanyaan saya: Apakah ada cara saya dapat menggunakan format di atas yaitu, from "foo-bar" import *untuk mengimpor modul yang ada -di dalamnya?

Bala
sumber
10
Mengapa Anda memiliki modul dengan tanda hubung pada namanya?
Matti Virkkunen
23
Saya menduga itu awalnya ditulis sebagai skrip daripada sebagai modul.
Michael Hoffman
@MattiVirkkunen makepy.py dari win32com akan menghasilkan modul dengan tanda hubung di dalamnya. sangat buruk. comtypes memecahkan ini dengan mengubahnya menjadi garis bawah
swdev
2
@MattiVirkkunen Saya pikir Python seharusnya tidak membatasi nama yang dapat saya berikan pada direktori saya. Bukan tanggung jawabnya untuk melakukannya.
Zelphir Kaltstahl

Jawaban:

117

kamu tidak bisa. foo-barbukan pengenal. ganti nama file menjadifoo_bar.py

Sunting: Jika importbukan tujuan Anda (seperti pada: Anda tidak peduli dengan apa yang terjadi sys.modules, Anda tidak perlu mengimpornya sendiri), cukup memasukkan semua global file ke dalam cakupan Anda sendiri, Anda dapat menggunakanexecfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 
SingleNegationElimination
sumber
24
Python 3.x Apa Yang Baru Di Python 3.0 Dihapus execfile (). Alih-alih execfile(fn)menggunakan exec(open(fn).read())Juga ada paket importlib.
DevPlayer
106

Jika Anda tidak dapat mengganti nama modul agar cocok dengan konvensi penamaan Python, buat modul baru untuk bertindak sebagai perantara:

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

 ---- main.py ----
 from foo_proxy import * 
Raymond Hettinger
sumber
30
Saya tidak akan pernah menerapkan ini. Tapi saya tidak bisa memberikan +1 untuk kecemerlangan belaka hack ini
inspectorG4dget
11
Anda benar-benar bisa melakukan ini tanpa foo_proxy.pyfile, tetapkan output dari __import__(...)ke sys.modules['foo_proxy']. Sebenarnya, jangan lakukan itu, itu ide yang buruk.
SingleNegationElimination
3
Keren apa yang saya cari. Ada usecase, jika seseorang menggunakan pustaka asli yang dikirimkan dengan distribusi.
Sven
46

Jika Anda tidak dapat mengganti nama file asli, Anda juga bisa menggunakan symlink:

ln -s foo-bar.py foo_bar.py

Maka Anda bisa:

from foo_bar import *
gitaarik
sumber
2

Seperti kata lain Anda tidak dapat menggunakan "-" dalam penamaan python, ada banyak solusi, salah satu solusi yang akan berguna jika Anda harus menambahkan beberapa modul dari jalur menggunakan sys.path

Misalnya jika struktur Anda seperti ini:

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

import barfoo
Reda Drissi
sumber