2016-03-08 19 views
7

Yani bir dosya işlemek için gereken bu python şey var. Bir python projesini yapılandırmanın çok basit bir yolu nedir?

Birincisi oldu:

my_project/ 
├── script.py 

Ve ben sadece python script.py file.csv ile çalıştırmak istiyorum.

Sonra büyüdü ve oldu:

my_project/ 
├── script.py 
├── util/ 
│ └── string_util.py 
├── services/ 
│ └── my_service.py 

(her dizinde boş bir __init__.py yoktur)

Ama şimdimy_service.pystring_util.py kullanmak istiyorum ve o kadar var Bu kadar güzel değil nasıl basit bir lanet olsun.

I (from services import my_service ile script.py aktarılır) my_service.py yılında from ..util import string_util yapmak isterdiniz, ama bu my_service 'ın __name__ beri python script.py ile çalışmıyor sonra sadece services.my_service (ve ben olsun Attempted relative import beyond toplevel package)

  • yapabileceğim cd .. ve python -m my_project.script, ama bu çok doğal görünüyor ve nasıl çalıştırılacağı talimatlar için README içine koymak için gerçekten kötü olurdu.

  • Şu anda çirkin sys.path.append() hack ile çözüyorum.

Başka hangi seçeneklerim var?

+0

Bunu almamı paylaşabilirim, ancak yanıt olarak gönderilecektir. Bana ne düşündüğünü biliyorum. – idjaw

cevap

2

Bu görüşle sınırlıdır, ancak bunu almamı paylaşacağım.

Projenize farklı bir şekilde bakmalısınız. Çalışmaya çalıştığınız tüm tuhaf göreceli ithalatlardan kaçınmak için bir yürütme noktası seçin ve içe aktarma işlemlerinizi oradan referans alın. Bu nedenle proje yapısı bakarak: Şu anda yapıyoruz gibi

my_project/ 
├── script.py 
├── util/ 
│ └── string_util.py 
├── services/ 
│ └── my_service.py 

, my_project içinden kodunuzu yürütün. Bu şekilde, tüm ithalatlarınız o noktaya göre olmalıdır. Bu nedenle, ithalat aslında şuna benzer:

# my_service.py 

from util.string_util import foo 

Bu konuda düşünmek için başka bir yol, etrafında projenizi taşımış veya bir CI var ise, size proje kök ne olduğundan emin belirtmek yapmak gerekir olmasıdır yürütmek istiyorsun. Bu şeyleri akılda tutarak ve projenizin gerçekleştirileceği yerdeki tek uygulama noktasını belirterek, paketlerinizi ve modüllerinizi yapılandırmak ve uygun şekilde bunlara başvurmak söz konusu olduğunda hayatınızı kolaylaştıracak ve diğer sistemlerin projenizi doğru bir şekilde kullanmasına izin verecektir. garip nispi ithalatlarla uğraşmak zorunda kalmadan.

Bu yardımcı olur umarım.

+0

Vay, aslında bu hiç bana olmadı. Ve bu çok basit. Bu yüzden '' ''i' 'in .util import string_util'' den silebilirim ve her şey yolunda. (eğer burada mutlak ithalat ile havalıysam, hangisiyim). Kesinlikle yardımcı olur. Teşekkürler! – Bloke

İlgili konular