2011-03-04 20 views
8

Python projemi yapılandırırken bazı sorunlarım var. Şu anda aynı klasördeki bir grup dosya. Ben dış dizinleri modülleri ithal etmek,Testler ve python paketi yapısı

proj/ 
    __init__.py 
    foo.py 
    ... 
    bar/ 
    __init__.py 
    foobar.py 
    ... 
    tests/ 
    foo_test.py 
    foobar_test.py 
    ... 

Sorun iç dizinleri, mümkün değildir olduğum gibi yapılandırmaya çalışmışlardır. Bu özellikle testlerle can sıkıcıdır.

Göreli ithalatlar ve PEP 366 ana modülünden gelen göreli aktarım hakkında PEP 328 okudum. Ancak her iki yöntem de temel paketin PYTHONPATH'ımda olmasını gerektirir. Nitekim aşağıdaki hatayı elde

ValueError: Attempted relative import in non-package.

Bu yüzden test dosyaları
import os, sys 
sys.path.append(os.path.join(os.getcwd(), os.path.pardir)) 

Hala aynı hatayı alıyorum üstünde aşağıdaki Demirbaş kodu eklendi. Ne testler ile tamamlandı,

  • yapısına bir paket için doğru yoldur ve
  • ithalatı izin yoluna taban dizini eklemek? yorumunda Talebiniz doğrultusunda

DÜZENLEME, ben mümkün olduğunca tam proj.NAME paket öneki kullanılarak modülleri aktarmak ister

import os, sys 
sys.path.append(os.path.join(os.getcwd(), os.path.pardir)) 
from ..foo import Foo 
+0

Başarısız bir örnek içe aktarma gösterebilir misiniz? –

+0

Ayrıca, lütfen "PYTHONPATH" –

+0

'echo $ PYTHONPATH 'değerinizi de şimdi boş bırakın. – Andrea

cevap

12

Kodu çalıştırmak için -m anahtarını kullandığınızda, geçerli dizin sys.path'a eklenir. sınamaları çalıştırmak için en kolay yolu komutunu kullanarak, proj ana dizinden yani:

python -m proj.tests.foo_test 

bu işi yapmak için, testler doğru olduğunu böylece Testlerinizi dizinde bir __init__.py dosyayı eklenmesi gerekmektedir paketin bir parçası olarak kabul edildi.

+0

Teşekkür ederiz! Yani eksik olan şey, testlerin kendisinin bir paket olması gerektiğiydi. Oldukça aptal bir hataydı, ama anlayamadım. – Andrea

5

(dosyada foo_test.py cinsinden) başarısız bir örnek alma ekleyin. Bu, Google Python styleguide'un önerdiği yaklaşımdır.

Paket yapınızı korumanıza olanak tanıyan bir seçenek, tam paket yolları kullanıp geliştirme ile ilerlemeye devam etmek sanalenv kullanmak ve projenizi geliştirme modunda kullanmaktır. Projenizin setup.py, develop komutunu almak için distutils yerine setuptools'u kullanmalıdır. foo_test.py kullandığı Nerede

% virtualenv ~/virt 
% . ~/virt/bin/activate 
(virt)~% cd ~/myproject 
(virt)~/myproject% python setup.py develop 
(virt)~/myproject% python tests/foo_test.py 

:

from proj.foo import Foo 

Eğer tüm paketlere işaret edecektir senin Virtualenv sizin PYTHONPATH içinden python çalıştırdığınızda Şimdi

Bu, yukarıda sys.path.append şeyler önlemek sağlayacak projende. Sanalenyanızı girmek için her seferinde . ~/virt/bin/activate yazmanız gerekmeden daha kısa bir kabuk takma adı oluşturabilirsiniz.

+0

İlginç görünüyor. Bu virtualenv aracını araştırmam gerekecek. Mevcut direklere bir paket olarak erişebileceğim sanal bir ortamda çalışmama izin veriyor mu? Ya da sadece izole bir python dağılımı olan bir araç mı - daha çok bir chroot gibi - kullanmadan önce paketimi her defasında kurmam gerekecek mi? – Andrea

+0

Patlayabileceğiniz ve hızlı bir şekilde yeniden oluşturabileceğiniz izole bir Python ortamı oluşturmanın hızlı bir yoludur. Sisteminizi Python'u kirletmeden pip/easy_install kullanarak modülleri denemek için iyi. Virtualenv 'activate' komut dizisi' ~/virt/bin' dir komutunu 'PATH'nizin önüne yerleştirir, böylece sistem pythonundan önce' ~/virt/bin/python' bulunur. 'Develop' komutu, projenizin paketlerini' .pth' dosyası kullanılarak '~/virt/lib/pythonx.x/site-pack' içine bağlar. Ayrıca, virtualenv 'inin içinde olduğunuzu size bildirmek için 'PS1' komutunu değiştirir. – samplebias

+0

İyi tavsiyeler, bu günlerde 'dağıtma'yı' setuptools' için daha aktif bir alternatif olarak seçmek isteyebilirsiniz. – ncoghlan

İlgili konular