質問

私の会社のスクリプトの1つをCSHからPythonに変換する問題があります。 CSHスクリプトはエイリアスコマンドを呼び出しますが、OS.System()を介して同じエイリアスコマンドを呼び出すとうまくいきません。

だから、fooがエイリアスコマンドの場合:

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

foo <argument>
.

Python(これは機能しません、エラークレームfooは不明なコマンドです):

os.system("foo <argument>")
.

i図Pythonスクリプトを実行すると、Pythonがシェルで作成されたエイリアスにアクセスできない場合に、ある種のコンテキストスイッチが起こらなければなりません。ドキュメントを読んだ後、os.systemsubprocessを支持して非推奨で、subprocessが私を助けることができるshellパラメータを持っていると思われます...問題はPython 2.3を使用して立ち往生していることです。 Tバージョン2.4まで入手可能です。

私はPythonの別名を複製するという考えを持っていました。したがって、例えば、subprocessfooにエイリアスされていました。

csh:

alias foo cp
foo file1 file2
.

Python:

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
.

私の最後の溝の努力は、cpを使用してPythonが呼び出すのが彼ら自身のcshスクリプトにそれらを置くコードの数行を取ることです。しかし、それに頼らずにこの作品を作る方法があるならば、私はそれについて知りたいです。

事前にありがとう!

役に立ちましたか?

解決

OS.SystemがCSHを使用すると思いますか?標準C機能システムを使用しているため、UNIXシステムではBASIC / BIN / SHと呼びます。これはCSHではありませんが、おそらくBash、またはそれのより単純なバージョンです。

BTW:os.systemのシェル環境で何をするのかは、それぞれが異なるサブシェルで実行されるため、OS.Systemへの後続の呼び出しには影響しません。言い換えれば、環境に加えられた変更は失われます。/ bin / shはCSHよりも異なる構文を使用しているため、エイリアスへの呼び出しは失敗します。

fooを実行していないだけでなく、行に沿って何かを回避することができます。

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

メモCSHを強制的に読み取ることを想定しているオプション-i

他のヒント

Pythonに "foo"エイリアスを持つことを望んでいる場合は、os.systemを呼び出す前に自分でエイリアスを実行してください。

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

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

Foo Aliasがより複雑な(引数置換など)の場合、これはより困難になる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top