10

Python の distutils または setuptools の setup() 関数を少し型にはまらない方法で呼び出したいのですが、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'],
     )

通常、このモジュールの RPM の .spec ファイルだけをビルドするにpython setup.py bdist_rpm --spec-onlyは、コマンド ラインを解析し、「bdist_rpm」コードを呼び出して RPM 固有のものを処理する を実行します。.spec ファイルは './dist' で終わります。

コマンドライン パラメータを解析せずに、'--spec-only' オプションを指定して 'bdist_rpm' コマンドを実行するように setup() 呼び出しを変更するにはどうすればよいですか? コマンド名とオプションをパラメーターとして setup() に渡すことはできますか? または、手動でコマンド ラインを作成し、それをパラメーターとして渡すことはできますか?

注: os.system() または subprocess モジュールなどを使用して、実際のコマンド ラインを使用して、別のプロセスでスクリプトを呼び出すことができることは既に知っています。あらゆる種類の外部コマンド呼び出しを使用しないようにしています。現在のインタープリターで setup() を実行するソリューションを特に探しています。

背景として、いくつかのリリース管理シェル スクリプトを単一の Python プログラムに変換しています。タスクの 1 つは、「setup.py」を実行して、さらにプレリリース テスト用の .spec ファイルを生成することです。'setup.py' を独自のコマンド ライン オプションを使用して外部コマンドとして実行するのは、厄介な方法のように思われ、プログラムの残りの部分を複雑にします。より Pythonic な方法があるように感じます。

4

2 に答える 2

15

これを試したことはありませんが、たまたま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']
)
于 2010-05-17T16:55:31.903 に答える
2

コマンドラインパラメーターを「偽装」するだけです-たとえば、スクリプトを次のように開始します

import sys

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

from distutils.core import setup

setup(name='Distutils',

などなど。結局のところ、distutilsコマンド ライン パラメータを取得する方法は次のとおりsys.argvです。したがって、sys.argv希望どおりに設定するだけで、見当違いのユーザーが入力したコマンドラインは完全に無視されます。

実際には、変更する前に、無視しようとしている引数をユーザー入力したかどうかを確認し、警告を表示するか、sys.argv の変更を回避するか、ユーザーが入力したものを「マージ」することをお勧めします。など...しかし、それはあなたが実際に尋ねたものとはかなり異なるので、そのままにしておきます;-)。len(sys.argv) > 1sys.argv

于 2010-05-18T05:12:12.323 に答える