Просто ради полноты, я хотел ответить на это, так как наткнулся на это, пытаясь выяснить, как сделать это самому. В моем случае я хотел быть уверен, что для выполнения команды использовалась версия Python той же , поэтому использование подпроцесса не было хорошим вариантом. (Правка: как указано в комментарии, я мог бы использовать sys.executable с подпроцессом, хотя программное выполнение по-прежнему является IMO более чистым подходом - и, очевидно, довольно простым.)
(Использование distutils.core.run_setup не вызывает подпроцесс, но использует exec в управляемой области / среде.)
from distutils.core import run_setup
run_setup('setup.py', script_args=['sdist'])
Другим вариантом, возможно, является использование команд setuptools, хотя я не исследовал это до конца. Очевидно, вам все еще нужно выяснить, как избежать дублирования метаданных proj.
from setuptools.dist import Distribution
from setuptools.command.sdist import sdist
dist = Distribution({'name': 'my-project', 'version': '1.0.0'}) # etc.
dist.script_name = 'setup.py'
cmd = sdist(dist)
cmd.ensure_finalized()
cmd.run() # TODO: error handling
В любом случае, надеюсь, это поможет кому-то в правильном направлении. В конце концов, существует множество веских причин для программного выполнения операций упаковки.