Непосредственно назовите установку distutil или setuptool () функцией с названием команды / опции, не анализируя командную строку?

Я хотел бы назвать установку 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 путь.

8
задан Ryan B. Lynch 17 May 2010 в 16:45
поделиться

2 ответа

Никогда не пробовал, но случайно заглянул в 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']
)
12
ответ дан 5 December 2019 в 12:08
поделиться

Просто «подделайте» параметры командной строки - например, запустите сценарий с

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, или «объединить» то, что набрал пользователь, и т. д., но это сильно отличается от того, что вы на самом деле просили, поэтому я собираюсь оставить все как есть ;-).

2
ответ дан 5 December 2019 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: