3

プログラムの 1 つのブートストラップ コードを作成し、subprocess.call を使用して virtualenv ディレクトリにインストールしようとしています。

最初に私が使用した:

subprocess.call(['pip', 'install', '-E', dir_name, 'processing'])

ubuntu で再実行すると、-E が古くなっていることに気付きました ( http://pypi.python.org/pypi/pip/ )。次を使用する必要があります。

virtualenv dir_name && dir_name/bin/pip install processing

これはコマンドラインからは正常に機能しますが、サブプロセスでは機能しません:

subprocess.call(['virtualenv', dir_name, '&&', '{0}/bin/pip'.format(dir_name), 'install', 'processing'])

次のエラー メッセージを返します。

There must be only one argument: DEST_DIR (you gave dir_name && dir_name/bin/pip install   processing)
Usage: virtualenv [OPTIONS] DEST_DIR

virtualenv.create_bootstrap_script(extra_text) も試しました(ただし、それを理解できず、gitから実行している追加のスクリプトがいくつかあります)

サブプロセスで何が間違っているのか、何を変更できるのか疑問に思っています。

ありがとう!

4

1 に答える 1

3

最初のコマンドのステータスを確認してから、条件付きで2番目のコマンドを実行します。

retval = subprocess.call(
    ['virtualenv', dir_name]
)
if retval == 0:
    # a 0 return code indicates success
    retval = subprocess.call(
        ['{0}/bin/pip'.format(dir_name), 'install', 'processing']
    )
    if retval == 0:
        print "ERROR: Failed to install package 'processing'"
else:
    print "ERROR: Failed to created virtualenv properly."

警告:以下の危険!

トークンが機能するためには&&、で引数shell=Trueを使用する必要がありますsubprocess.call。ただし、ユーザーからの入力を受け入れる場合は、shell = Trueを使用しないでください。これにより、任意のコードが実行される可能性があります

さらに、引数を結合する必要があります。

ハードコーディングしているdir_nameを使用している場合:

cmdline = ' '.join(['virtualenv', dir_name, '&&', '{0}/bin/pip'.format(dir_name), 'install', 'processing'])
subprocess.call(
    cmdline,
    shell=True
)
于 2012-07-11T19:44:48.250 に答える