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.