2011-05-09 18 views
9

Aynı modül adı kullanılarak içe aktarılması gereken iki Python modülüne rastladım.Python modül adı çakışması

import foo 

ben bu işlevleri sağlar birini bulana kadar bu yüzden bir yol aynı adla modüllerin arasında geçiş yapmak için orada, İstediğim (örn foo.bar()) belirli işlevleri sağladığını biliyor musunuz? Yoksa kurulumdan önce modülü yeniden adlandırmaktan başka yolu yok mu?

Düzenleme: Ne demek istediğimi açıklamak, her iki modül içindeki site paketleri şunlardır:

site-packages$ ls python_montage-0.9.3-py2.6.egg 
EGG-INFO montage 
site-packages$ ls montage-0.3.2-py2.6.egg/ 
EGG-INFO montage 
+0

Modül adınızı yeniden adlandırmanıza izin vermeyen hiçbir şey yok mu? çünkü bildiğim kadarıyla bu sorunu çözmenin kolay bir yolu var :) – mouad

+0

Bu modüller nerededir, yol bilgisi? Site-paketleri dizininizde ve geçerli dizinde (içe aktarma dosyasının) bir tane var mı? Bu durumda belirsizlik problemini çözmek için mutlak ithalatı kullanabilirsiniz. üst düzey modülü adıdır çünkü aynı olduğunu ben bunu yapabileceğimi sanmıyorum –

+0

Her iki modül site paketleri dizininde biri içerde Bunu açıklığa kavuşturmak için soru. __import__' 'için – astrofrog

cevap

0

piton 2.5 (and PEP 328) mutlak ithalat python modülleri yönetmenin tercih yoludur beri. Senin durumunda , sizin modül ağaç böyle kesinlikle:

: Burada
import second_level.foo 
+0

bu daha net hale getirilecek soruyu düzenledikten - - Düzenleme yaptığım – astrofrog

5

bir yoludur: Eğer çubuk yöntemi ile foo modülünü kullanmak istiyorsanız

/src/first_level/foo 
       /other_foo 
    /second_level/foo # with the bar method 

, bunu kullan

import imp 
import sys 


def find_module(name, predicate=None): 
    """Find a module with the name if this module have the predicate true. 

    Arguments: 
     - name: module name as a string. 
     - predicate: a function that accept one argument as the name of a module and return 
      True or False. 
    Return: 
     - The module imported 
    Raise: 
     - ImportError if the module wasn't found. 

    """ 

    search_paths = sys.path[:] 

    if not predicate: 
     return __import__(name) 

    while 1: 
     fp, pathname, desc = imp.find_module(name, search_paths) 
     module = imp.load_module(name, fp, pathname, desc) 

     if predicate(module): 
      return module 
     else: 
      search_paths = search_paths[1:] 

Bahse girerim ki dikkate almadığım bazı köşeler var ama umarım bu size bir fikir verebilir.

N.B: Mümkünse modülünüzü yeniden adlandırmanın en iyi yol olacağını düşünüyorum.

N.B 2: i Düzenlenen cevap gördüğünüz gibi iki modül aynı dizine (site paketleri /) mevcut olduklarından, ne yazık ki bu çözüm işe yaramaz. Eğer diğer bazı sezgisel yoluyla dosya adlarını anlamaya ki mutluysan

+0

1, olmayan bir deyim ithalat yapabileceğini bilmiyordu ve ne gerekli. – keflavich

0

, o zaman bunları ayrı ayrı yüklemek için imp.load_module kullanmak gerekir. Her iki yumurta piton yolunda olmasına rağmen

, Senin durumunda

http://docs.python.org/library/imp.html#imp.load_module Bak, yumurta biraz sihir yapmak inanıyoruz sayede bir yol olarak her bir yumurta davranır. Yumurta dosyasını ayrı ayrı yüklemek için imp.find_module yol argümanı olarak ayarlayabilirsiniz.

3

aynı adı sınırlaması iki modülden etrafında kesmek için yolu vardır, ancak eğitim amaçlı sadece bu getirmediğiniz sürece ben bunu tavsiye etmem. Sonuç, kafa karıştırıcı ve sürdürülemez olacaktır. Belirsiz Python içe aktarma özellikleriyle uğraşmak yerine, modüllerin birini veya her ikisini birden değiştirmenizi öneririz.