0

別のプロセスを実行する必要があるPythonプログラムがあります(私はsubprocess.Popenそのために使用します)。この実行は、シェルコマンドプロンプトでユーザーが次のように入力したかのように動作する必要があります。

$ source path/to/some_file
$ ./some_program

shell=True最初にプログラムを実行してから実行するために、何らかの形式のコマンドチェーンを使用することを期待しsourceています。しかし、私は次の問題に直面しています。

私のPythonプログラムを起動するシェルは、、、(または他のフレーバー)である可能性bashがありshます。実行しているシェルに基づいて、別のソースを取得する必要があります。これを判断する方法はありますか?Pythonで、または内部で何かを実行することで、どちらも実行できます。tcshcshsome_filePopen(..., shell=True)

さまざまなシェルからさまざまな出力を取得するために、ある種の「シェルポリグロット」を作成することを検討していましたが、私のシェルスキル(特にcsh)はそのようなタスクに対応していません。どのようなオプションがありますか?

4

2 に答える 2

3

どのシェルが使用されるsubprocess.Popen()かは、Pythonの起動に使用される親シェルによって決定されません。むしろ、Pythonで使用されるシェルは常に/bin/shデフォルトであり、必要に応じてで実行可能ファイルを明示的に指定することで変更できますPopen()

しかし実際には、特定の種類のシェル用に任意のシェルスクリプトを記述できます。だとしましょうbash。次に、次のようなシェルスクリプトを作成することで、Python側でこれらの詳細を無視できます。

#!/usr/bin/env bash
source path/to/some_file
exec ./some_program

開始時にbashに切り替え、必要なビットを調達し、プログラムを起動する完全なランチャースクリプトです。妥当なシェルであればどれでも実行できるはずなので、Pythonが呼び出すシェルを正確に心配する必要はありません...さらに、Pythonの外部でプログラムを起動するためのより反復可能な方法があります。

于 2013-03-26T13:25:08.370 に答える
1

..シェルを生成してから通信するのはどうですか?

つまり、次のようなものです。

proc = subprocess.Popen(['/bin/bash'], stdin=PIPE, stdout=PIPE)
proc.communicate("source path/to/some_file\n"
                 "./some_program\n")

特定のシェル内で2つのコマンドを実行したいので、これが最善の解決策になると思います。

そうしないと、シェルが「initスクリプト」や「初期コマンド」などの引数を受け入れる場合があります。この場合、その特定のシェルのみを使用する必要がある場合は、それらを使用する必要があります。たとえば、bashは受け入れ--init-file file-c commandそれがジョブを実行します(--init-filebashrcの代わりにロードされます)。

于 2013-03-26T13:23:54.767 に答える