Modül adında '-' tire veya kısa çizgi olduğunda modül nasıl alınır?


195

Foo-bar.py dosyasını içe aktarmak istiyorum. Bu çalışıyor:

foobar = __import__("foo-bar")

Bu değil:

from "foo-bar" import *

Benim sorum: Yukarıdaki biçimi yani içinde from "foo-bar" import *bir modül almak için kullanabilirsiniz herhangi bir yolu var mı -?


10
Neden adında tire bulunan bir modül var?
Matti Virkkunen

23
Başlangıçta bir modül olarak değil, bir komut dosyası olarak yazılmıştır tahmin ediyorum.
Michael Hoffman


Win32com'un @MattiVirkkunen makepy.py içindeki çizgi ile modül üretecek. çok kötü. comtypes bunu alt çizgiye çevirerek çözdü
swdev

2
@MattiVirkkunen Bence Python dizinlerime verebileceğim isimleri sınırlamamalı. Bunu yapmak onun sorumluluğunda değildir.
Zelphir Kaltstahl

Yanıtlar:


117

yapamazsın. foo-barbir tanımlayıcı değil. dosyayı yeniden adlandırfoo_bar.py

Düzenleme: Eğer import: (Birlikte ne umurumda değil gibi hedef değil sys.modules, sen kullanabilirsiniz sadece kendi kapsamı içine dosyanın globalsin tüm alma, sen kendini ithal etmek gerekmez)execfile

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

24
Python 3.x Python 3.0'daki Yenilikler Execfile () kaldırıldı. Yerine execfile(fn)kullanımı exec(open(fn).read())Ayrıca paket importlib yoktur.
DevPlayer

106

Modülü Python adlandırma kurallarına uyacak şekilde yeniden adlandıramazsanız, aracı görevi görecek yeni bir modül oluşturun:

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

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

30
Bunu asla uygulamam. Ama bu hack'in parlaklığı için +1 veremem
inspectorG4dget

11
Aslında olmadan bu yapabileceğini foo_proxy.pyçıkış atamak, dosyaya __import__(...)için sys.modules['foo_proxy']. Aslında bunu yapma, bu korkunç bir fikir.
SingleNegationElimination

3
Sadece aradığım şey havalı. Bir dağıtım ile birlikte gelen yerel kütüphaneler kullanılıyorsa, bir usecase vardır.
Sven


46

Orijinal dosyayı yeniden adlandıramazsanız, bir sembolik bağlantı da kullanabilirsiniz:

ln -s foo-bar.py foo_bar.py

Sonra şunları yapabilirsiniz:

from foo_bar import *

2

Diğerleri gibi "-" python adlandırma kullanamazsınız, bir yoldan birden fazla modül eklemek zorunda kalırsanız yararlı olacak bir geçici çözüm vardır sys.path

Örneğin, yapınız şöyle ise:

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

import barfoo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.