2013-01-19 16 views
7

Diyelim ki bir proje proj çağrıda ve aşağıdaki yapıya sahip bu projede diyelim: Projeniz içinde değildirsetup.py: adlandırma src paket adı proje

proj/ 
    dists/ 
    doc/ 
    src/ 
    __init__.py 
    xyz.py 
    abc.py 
    test/ 
    setup.py 

içeriğin tamamını görebileceğiniz gibi src alt klasörü. src klasöründen dağıtım paketleri dağıtmak nasıl yapılır?

Benim naif bir fikir, the tutorial aşağıdaki böyle setup.py yazmaya olurdu:

#omitting basics 
setup(
    name='proj', 
    packages=['src'], 
    package_dir={'proj':'src'} 
) 

Ama sisteme çıkan paketini kurduktan sonra, hala src.xyz değil proj.xyz, ithal etmek zorunda olan amaç ve beklenen sonuç olurdu.

cevap

-3

Eğer setup işlevini çağırmadan önce PYTHONPATH için src klasörü eklemeyi deneyebilirsiniz:

os.chdir(src_path) 
: sadece güvenli tarafta olmak üzere, aynı zamanda

import sys, os 
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src') 
sys.path.append(src_path) 

Ve, daha sonra çalışma dizinini değiştirmek

Bundan sonra, her şey yolunda olmalıdır.

Uygulamanızı paketlemek için kullanabileceğiniz diğer bazı araçlar bunu içeriden desteklemektedir. Kurulum araçları olduğunu düşündüm, PyInstaller. Ama temel olarak, bu sadece yapılması gereken, paketlerinizin doğrudan içe aktarılması için yeterli.

Dışa dönüklük, package_dir yönergesine sahiptir. Kullanmanız gereken budur, ancak , yalnızca paketinizi PYTHONPATH'a ekleyerek işe yarayabilir.

proj/ 
    src/ 
    proj/ 
     __init__.py 
     xyz.py 
     abc.py 
    setup.py 

Ve üzere setup.py değişen:

# ... 
setup(
    name='proj', 
    packages=['proj'], 
    package_dir={'':'src'} 
) 

Bu distutils tarafından gerekli değildir ancak diğer araçları üst dizin beklediğinizden

+1

Ben henüz sorun var emin değilim. Diğer insanların kolayca kendilerine yükleyebileceği bir python paketi yazmaya çalışıyorum. Sadece başka bir klasörde yazdığın şeyleri ithal etmekle ilgili değil. – erikbwork

+0

Evet anlıyorum, fakat 'setup.py' çalışabilmesi için başka bir klasöre öğe aktarmak zorunda. Bu paketler PYTHONPATH'nızda olduğunda, nerede oldukları önemli değil. Eğer senin için işe yaramadıysa, başka bir yol görmelisin, üzgünüm. – jadkik94

+0

Üzgünüz, ama sorun değil. – erikbwork

4

Sen proj/ dizine Python paketi dosyalarını koyarak bunu düzeltmek Bu durumda Python paket adı yani proj ile aynı olması için __init__.py dosyasının adı.

+0

Bunu yaptım ve işe yarıyor. Yine de son yorumunuzu anladığımdan emin değilim. Demek istediğim, beklendiği gibi çalışmak için 'proj/src/proj' gibi bir klasör yapmamı bekleyen araçlar var mı? Bu kadar verimsiz görünüyor. Yoksa burada verimsiz bir şey mi yapıyorum? – erikbwork

+0

Dizinin adı: '/__ init __. Py', Python paket adı ile aynı olmalıdır, i.e. eğer' __init __. Py' görürsem, o zaman sadece ana dizin adına bakarak Python paketinin ne olduğunu biliyorum. – jfs

2

Bu burada bildirilen setuptools bir hatadan kaynaklanmaktadır: https://github.com/pypa/setuptools/issues/250

Temelde, çalışır ancak dev modunda.Şimdi 3 çözümler var tarih:

  • sembolik link proj olarak src paketi (ve comitting zaman bunu görmezden), bu olacak kutunun çalışır ancak src den proj
  • için kirli
  • değişimdir oluşturmak src alt-klasör proj aşağıdaki seçenekleri kullanın ve:
 
packages=['proj'], 
package_dir={'proj': 'src/proj'}, 
+0

Kurulum için bağlantı sorun: https://github.com/pypa/setuptools/issues/250 –

+0

Sorun şu anda 3.5+ için kapalı – Daniel

İlgili konular