3

会社のスクリプトの 1 つを csh から Python に変換する際に問題が発生しています。csh スクリプトはエイリアス化されたコマンドを呼び出しますが、同じエイリアス化されたコマンドを os.system() 経由で呼び出すと、機能しません。

したがって、fooエイリアス化されたコマンドの場合:

CSH スクリプト (これは機能し、foo を実行します):

foo <argument>

Python (これは機能しません。エラーは foo が不明なコマンドであると主張します):

os.system("foo <argument>")

Pythonスクリプトを実行すると、何らかのコンテキストスイッチが発生する必要があると思います。これにより、Pythonはシェルで作成されたエイリアスにアクセスできなくなります。ドキュメンテーションを読んだ後、os.systemは を支持して廃止されているようでsubprocess、それには私を助けることsubprocessshellできるパラメータがあります... 問題は、私が Python 2.3 の使用に行き詰まっており、subprocessバージョン 2.4 まで利用できないことです。 .

Pythonでエイリアスを複製するという考えがありました。たとえば、 はfooにエイリアスされていたとしcpます。

CSH:

alias foo cp
foo file1 file2

パイソン:

os.system("alias foo cp")
os.system("foo file1 file2")

サイコロはありません...ここにもエラーがあります:

sh: line 0: alias: foo: not found
sh: line 0: alias: cp: not found
sh: foo: command not found

foo私の最後の努力は、Python が呼び出す独自の CSH スクリプトにそれらを使用する数行のコードを取得することです。しかし、それに頼らずにこれを機能させる方法があれば、私はそれについて知りたいです.

前もって感謝します!

4

2 に答える 2

8

os.system が csh を使用すると考えた理由は何ですか? これは、Unix システムでは基本的な /bin/sh だけを呼び出す標準の C 関数システムを使用します。これは csh ではありませんが、おそらく bash か、その単純なバージョンです。

ところで: os.system のシェル環境で行うことは、os.system への後続の呼び出しには影響しないことに注意してください。それぞれが異なるサブシェルで実行されるためです。つまり、環境に加えられた変更は失われます。また、エイリアスの呼び出しは失敗します。これは、/bin/sh が csh とは異なるエイリアスの構文を使用するためです。

not を実行することでこれを回避できますがfoo、行に沿って何かを実行できます。

os.system("/bin/csh -i -c 'foo arg1 arg2'")

-icsh に起動スクリプトを強制的に読み込ませるオプションに注意してください。

于 2010-07-15T17:41:44.927 に答える
0

Python で "foo" エイリアスを使用する場合は、os.system を呼び出す前に自分でエイリアスを実行します。

cmd = "foo file1 file2"
foo_alias = "cp"

cmd = re.sub("^foo ", foo_alias + " ", cmd)
os.system(cmd)

foo エイリアスがより複雑な場合 (引数の置換など)、これはより困難になる可能性があります。

于 2010-07-15T17:37:42.100 に答える