Chciałbym nazwać Python's distutils lub setuptools w funkcji setup() w nieco niekonwencjonalny sposób, ale nie jestem pewien, czy distutils są przeznaczone do tego rodzaju użycia.Bezpośrednio wywołuje funkcję setup() distutils lub setuptools za pomocą nazwy polecenia/opcji, bez parsowania wiersza poleceń?
Jako przykład, powiedzmy, że obecnie mają „setup.py” plik, który wygląda tak (podnoszone verbatim z distutils docs - korzystanie setuptools jest niemal identyczna):
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'],
)
Normalnie , aby zbudować tylko plik .spec dla RPM tego modułu, mógłbym uruchomić python setup.py bdist_rpm --spec-only
, który parsuje wiersz poleceń i wywołuje kod "bdist_rpm", aby obsłużyć specyficzne dla RPM rzeczy. Plik .spec kończy się na './dist'.
Jak zmienić moje wywołanie setup(), aby uruchamiało polecenie "bdist_rpm" z opcją "--spec-only", BEZ analizowania parametrów wiersza polecenia? Czy mogę przekazać nazwę polecenia i opcje jako parametry do ustawienia()? Czy mogę ręcznie utworzyć wiersz polecenia i przekazać go jako parametr?
UWAGA: Wiem już, że mógłbym wywołać skrypt w oddzielnym procesie z rzeczywistą linią poleceń, używając os.system() lub modułu podprocesowego lub czegoś podobnego. Próbuję unikać używania jakichkolwiek zewnętrznych wywołań poleceń. Szukam specjalnie dla rozwiązania, które uruchamia setup() w bieżącym interpretera.
W tle konwertuję niektóre skrypty powłoki zarządzania wersjami do jednego programu w języku Python. Jednym z zadań jest uruchomienie "setup.py" w celu wygenerowania pliku .spec do dalszych testów wstępnych. Uruchamianie "setup.py" jako zewnętrznego polecenia z własnymi opcjami wiersza poleceń wydaje się być niewygodną metodą, która komplikuje resztę programu. Czuję, że może być bardziej Pythonicznie.
Podoba mi się pytanie. Wydaje mi się, że 'setup()' jest źle zaprojektowany - powinien przynajmniej wziąć argument 'sys.argv' jako argument zamiast wykonywać magię. Parametr może nawet domyślnie "sys.argv" (jak w argparse), ale powinien być zarówno udokumentowany, jak i widoczny w sygnaturze funkcji. – abukaj