2010-05-17 17 views
7

Python'un dikkat dağıtıcılarını veya setuptools'un setup() işlevini biraz alışılmadık bir şekilde aramak istiyorum, ancak dağıtımın bu tür bir kullanım için uygun olup olmadığından emin değilim.Komut satırı/seçenekleri ile komut satırını ayrıştırmadan doğrudan 'ya da setuptools' setup() işlevini çağırın.

from distutils.core import setup 

setup(name='Distutils', 
     version='1.0', 
     description='Python Distribution Utilities', 
     author='Greg Ward', 
     author_email='[email protected]', 
     url='http://www.python.org/sigs/distutils-sig/', 
     packages=['distutils', 'distutils.command'], 
    ) 

Normalde: - (Setuptools kullanımı neredeyse aynı distutils dokümanlardan kelimesi kelimesine kaldırdı) Örnek olarak

, en Şu anda şöyle bir 'setup.py' dosyası, var diyelim Bu modülün bir RPM'si için sadece .spec dosyası oluşturmak için, komut satırını ayrıştıran ve RPM'ye özgü şeyleri işlemek için 'bdist_rpm' kodunu çağıran python setup.py bdist_rpm --spec-only'u çalıştırabilirim. .spec dosyası './dist' içinde biter.

Kurulum() çağrısı, 'bdist_rpm' komutunu '- sadece' seçeneğiyle, ayrıştırma komut satırı parametreleri olmadan çalıştıracak şekilde nasıl değiştirebilirim? Komut adını ve seçenekleri setup() olarak parametreler olarak iletebilir miyim? Veya el ile bir komut satırı oluşturabilir ve bunun yerine bir parametre olarak iletebilir miyim?

NOT: Komut dosyasını, os.system() veya alt işlem modülü veya benzeri bir şey kullanarak, gerçek bir komut satırıyla ayrı bir işlemde arayabileceğimi zaten biliyorum. Herhangi bir harici komut çağırma yöntemini kullanmaktan kaçınmaya çalışıyorum. Mevcut yorumlayıcıda setup() işlevini çalıştıran bir çözüm için özellikle arıyorum.

Arka plan için, bazı yayın yönetimi kabuk betiklerini tek bir Python programına dönüştürüyorum. Görevlerden biri, daha fazla yayın öncesi test için bir .spec dosyası oluşturmak üzere 'setup.py' çalıştırıyor. 'Setup.py' komutunu kendi komut satırı seçenekleriyle bir dış komut olarak çalıştırmak, garip bir yöntem gibi görünüyor ve programın geri kalanını zorlaştırıyor. Daha Pythonic bir yol olabileceğini hissediyorum.

+0

Soruyu beğeniyorum. Benim için 'setup()' zayıf bir şekilde tasarlanmış gibi görünüyor - en azından bazı sihir yapmak yerine argüman olarak 'sys.argv 'almalı. Parametre, sys.argv '(argparse'de olduğu gibi) için de varsayılan olabilir, ancak işlev imzasında hem belgelenmiş hem de görünür olmalıdır. – abukaj

cevap

9

Bunu hiç denemedim, ama ben setup() başlangıcında yakın bir yerde bu fark distutils/core.py, bakmak oldu: Yani

if 'script_name' not in attrs: 
    attrs['script_name'] = os.path.basename(sys.argv[0]) 
if 'script_args' not in attrs: 
    attrs['script_args'] = sys.argv[1:] 

, bu eğer yapabilirsen olarak "sahte-out görünüyor "ekleyerek kurulum():

setup(
    ... 
    script_name = 'setup.py', 
    script_args = ['bdist_rpm', '--spec-only'] 
) 
+0

@ ig0775: Teşekkürler, tam olarak istediğim şey buydu. Sadece test ettim ve gayet iyi çalışıyor. Çok temiz görünüyor da. –

1

Sadece "sahte" komut parametreleri - örneğin ile size senaryoyu başlatmak

import sys 

sys.argv[1:] = ['bdist_rpm', '--spec-only'] 

from distutils.core import setup 

setup(name='Distutils', 

vs, vb. Sonuç olarak, distutils komut satırı parametrelerini böyle alır: sys.argv! Yani, tam olarak istediğiniz gibi olmak için sys.argv ayarlayın ve yanlış yönlendirilmiş kullanıcının yazdığı komut satırı ne olursa olsun tamamen göz ardı edilecektir. Eğer sys.argv değiştirmeden önce len(sys.argv) > 1 - -

Aslında kullanıcı görmezden üzereyiz herhangi bir argüman girmek yaptıysam kontrol etmek isteyebilirsiniz sys.argv değişmelerinin ve bir uyarı vermek veya önlemek veya Kullanıcı tarafından yazılanları "birleştirin" ... ama aslında sorduğunuzdan oldukça farklı, ben de bunu bırakacağım ;-).

+0

Bu benim için gerçekleşti, ama dağınık görünüyordu.Ama eğer @ ig0774'ün yöntemi için olmasaydı, büyük ihtimalle bunu nasıl ele alırdım. –

+0

@ RyanB.Lynch: * dağınık gibi görünüyor * - Üzgün, üzücü olan şey şudur: Distutils 've Setup Tools' 'run_setup' rutini tam olarak bunu yapar, sadece üstüne biraz buzlanma ile. Bunu, kaynaklarda bulabilirsiniz (http://github.com/pypa/setuptools/blob/master/setuptools/sandbox.py) ("run_setup" araması). – Wrzlprmft

İlgili konular