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.