7

これをPythonで複製したいと思います:

gvimdiff <(hg cat file.txt) file.txt

(hg cat file.txtは、最後にコミットされたバージョンのfile.txtを出力します)

ファイルをgvimdiffにパイプする方法は知っていますが、別のファイルを受け入れません。

$ hg cat file.txt | gvimdiff file.txt -
Too many edit arguments: "-"

Pythonの部分に行きます...

# hgdiff.py
import subprocess
import sys
file = sys.argv[1]
subprocess.call(["gvimdiff", "<(hg cat %s)" % file, file])

サブプロセスが呼び出されると、ファイル名として渡されるだけ<(hg cat file)です。gvimdiff

それで、bashのようにコマンドをリダイレクトする方法はありますか?簡単にするために、ファイルをキャットしてdiffにリダイレクトするだけです。

diff <(cat file.txt) file.txt
4

4 に答える 4

9

それはできます。ただし、Python 2.5 の時点では、このメカニズムは Linux 固有のものであり、移植性がありません。

import subprocess
import sys

file = sys.argv[1]
p1 = subprocess.Popen(['hg', 'cat', file], stdout=subprocess.PIPE)
p2 = subprocess.Popen([
    'gvimdiff',
    '/proc/self/fd/%s' % p1.stdout.fileno(),
    file])
p2.wait()

つまり、diff の特定のケースでは、stdin からファイルの 1 つを取得するだけで、問題の bash に似た機能を使用する必要がなくなります。

file = sys.argv[1]
p1 = subprocess.Popen(['hg', 'cat', file], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['diff', '-', file], stdin=p1.stdout)
diff_text = p2.communicate()[0]
于 2008-09-16T23:57:32.093 に答える
2

コマンドモジュールもあります。

import commands

status, output = commands.getstatusoutput("gvimdiff <(hg cat file.txt) file.txt")

コマンドの実行中に実際にコマンドからデータを取得したい場合は、popen関数のセットもあります。

于 2008-09-16T23:53:40.170 に答える
2

これは実際にはドキュメントの例です:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

つまり、次のことを意味します。

import subprocess
import sys

file = sys.argv[1]
p1 = Popen(["hg", "cat", file], stdout=PIPE)
p2 = Popen(["gvimdiff", "file.txt"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

これにより、Linux 固有の /proc/self/fd ビットの使用が削除され、Solaris や BSD (MacOS を含む) などの他の unice で動作し、Windows でも動作する可能性があります。

于 2008-09-17T01:26:43.597 に答える
-1

おそらく popen 関数の 1 つを探していると思いました。

から: http://docs.python.org/lib/module-popen2.html

popen3(cmd[, bufsize[, mode]]) サブプロセスとして cmd を実行します。ファイル オブジェクト (child_stdout、child_stdin、child_stderr) を返します。

ナマステ、マーク

于 2008-09-16T23:57:24.840 に答える