2014-12-08 11 views
10

Bir IPython kabuğundan bir modül (venues) almaya çalışıyorum. venues modülü doğru olarak alınır, ancak daha sonra makesoup adlı bir modülü içe aktarmaya çalışır ve bunu yapamaz.Python 3: komut dosyasıyla aynı dizinde modül: "ImportError: Adsız modül yok"

~ dizininde bulunur ve processors alt dizininde bulunan venues.py dosyasını almaya çalışıyorum. makesoup.py dosyası, processors alt dizininde de bulunur; bu, yakınındaki herhangi bir Python komut dosyasının bulunması gerekir, değil mi?

In [1]: import processors.venues 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 
<ipython-input-1-765135ed9288> in <module>() 
----> 1 import processors.venues 

~/processors/venues.py in <module>() 
     7 """ 
     8 
----> 9 import makesoup 
    10 import re 
    11 

ImportError: No module named 'makesoup' 

Ben başarısız, hem~ ve processors dizinleri boş __init__.py ekledik.

Not: processors adresinde bulunduğumda doğru olarak makesoup modülü alınır, ancak bunun çalışması için tek yol olmadığını biliyorum.

cevap

17

The makesoup.py file is also located in the processors subdirectory, which means any Python script near it should be able to find it, right?

sayılı Bu özellik was changed in Python 3 ve artık çalıştığını sözdizimi.

Değişim Buna import makesoup:

from . import makesoup 

Ya da bu kadar

:

Bunların her ikisi de hala ev dizinden python -m processors.venues yapabilirsiniz olsa imkansız doğrudan python processors/venues.py çalıştırmak için yapacak
from processors import makesoup 

.

+0

Teşekkür ederim Kevin. Ancak, bu çözümlerin neden "venues.py" yönergesini çalıştırmayı imkansız kılacağını anlamıyorum. Nedenini söyler misin? –

+0

Açık bir göreceli içe aktarma (listelediğim ilk seçenek) kullanırsanız, '__package__' sihirli değişkeni ayarlanmalıdır, ancak' python', '-m' olmadan doğrudan bir komut dosyası çalıştırırken bunu yapmaz. Mutlak bir içe aktarma kullanırsanız, Python, betikle aynı dizinde bulunmadığı için, 'processors' paketini bulamayabilir. Tekrar, -m, bunu düzeltir. – Kevin

İlgili konular