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?


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'
>>> 

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 * 

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 *

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.