Я хотел бы назвать установку distutil или setuptool Python () функцией немного нетрадиционным способом, но я не уверен, ли предназначен distutils для этого вида использования.
Как пример, скажем, у меня в настоящее время есть 'setup.py' файл, который похож на это (снятый дословно с distutils документов - setuptools использование почти идентично):
from distutils.core import setup
setup(name='Distutils',
version='1.0',
description='Python Distribution Utilities',
author='Greg Ward',
author_email='gward@python.net',
url='http://www.python.org/sigs/distutils-sig/',
packages=['distutils', 'distutils.command'],
)
Обычно, для создания просто .spec файла для об/мин этого модуля я мог работать python setup.py bdist_rpm --spec-only
, который анализирует командную строку и называет код 'bdist_rpm' для обработки ОПРЕДЕЛЕННОГО ДЛЯ ОБ/МИН материала. .spec файл заканчивается в './dist'.
Как я могу изменить свою установку () вызов так, чтобы это выполнило команду 'bdist_rpm' с '-' опция только для спецификации, не анализируя параметры командной строки? Я могу передать название команды и опции как параметры для установки ()? Или я могу вручную создать командную строку и передачу это в качестве параметра, вместо этого?
Примечание: Я уже знаю, что мог назвать сценарий в отдельном процессе, с фактической командной строкой, с помощью os.system () или модуль подпроцесса или что-то подобное. Я стараюсь не использовать любой вид внешних вызовов команды. Я ищу именно решение, которое выполняет установку () в текущем интерпретаторе.
Для фона я преобразовываю некоторые сценарии оболочки управления версиями в единственную программу Python. Одна из задач выполняет 'setup.py' для генерации .spec файла для дальнейшего предрелизного тестирования. При выполнении 'setup.py', поскольку внешняя команда, с ее собственными параметрами командной строки, походит на неловкий метод, и она усложняет остальную часть программы. Я чувствую, что может быть больше Pythonic путь.
Никогда не пробовал, но случайно заглянул в distutils/core.py, где заметил следующее в начале setup()
:
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:]
Итак, похоже, что вы можете "подделать" setup(), добавив:
setup(
...
script_name = 'setup.py',
script_args = ['bdist_rpm', '--spec-only']
)
Просто «подделайте» параметры командной строки - например, запустите сценарий с
import sys
sys.argv[1:] = ['bdist_rpm', '--spec-only']
from distutils.core import setup
setup(name='Distutils',
и т.д. и т. Д. В конце концов, как distutils
получает параметры командной строки: это выглядит в sys .argv
! Итак, просто установите sys.argv
в точности так, как вы хотите, и какая бы командная строка ни ввела ошибочный пользователь, она будет полностью проигнорирована.
На самом деле, вы можете проверить, вводил ли пользователь какой-либо аргумент, который вы собираетесь игнорировать - len (sys.argv)> 1
, прежде чем изменять ] sys.argv
- и дать предупреждение, или избежать изменения sys.argv, или «объединить» то, что набрал пользователь, и т. д., но это сильно отличается от того, что вы на самом деле просили, поэтому я собираюсь оставить все как есть ;-).