2

コマンドラインを介して実行されるPythonスクリプトをPythonCGIに移植しているので、HTMLフォーム要素を使用してオプションを制御できます。コマンドの結果にアクセスするにはどうすればよいですか?

スクリプトは現在、次のコマンドを実行しています。

  • svnアップデート
  • rsyncは他のローカルフォルダから画像をコピーします
  • CSSを再コンパイルします
  • svncommit*これらのコマンドを12回以上ループします

    #!/usr/bin/python
    print 'Content-Type: text/plain'
    print
    print 'test...'
    os.system("svn update /Users/daverau/titles/or_mm_creating_website_3e")
    

このコマンドのコンソール出力にアクセスするにはどうすればよいですか?この種のローカルジョブを設定するためのより良い方法はありますか?

セキュリティは問題ではありません。これは私だけのローカルMacツールです。

4

3 に答える 3

2

2 つの適切な回答は、サブプロセス モジュールを示しています。

このモジュールを中心に構築された、一見の価値のあるラッパーもいくつかあります。

1) sh モジュール (旧 PBS)

[更新] MS Windows で行き詰まっている場合は PBS を使用してください。それ以外の場合は、その後継であるsh モジュールを使用してください。

sh モジュールの使用:

from sh import ifconfig, ls
print(ifconfig("eth0"))
print(ls('-la'))

PBS を使用して、https ://github.com/amoffat/pbs の README から:

import pbs
print pbs.ifconfig("eth0")
print pbs.ls('-la')

2) プラムバム

詳細情報はhttp://plumbum.readthedocs.org/en/latest/にあります。

README ファイルからのいくつかの例:

基本:
>>> from plumbum import local, FG, BG
>>> from plumbum.cmd import ls, grep, wc, cat, head
>>> ls
LocalCommand(<LocalPath /bin/ls>)
>>> ls()
u'build.py\ndist\ndocs\nLICENSE\nplumbum\nREADME.rst\nsetup.py\ntests\ntodo.txt\n'
配管:
>>> chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]
>>> print chain
/bin/ls -a | /bin/grep -v '\.py' | /usr/bin/wc -l
>>> chain()
u'13\n'
リダイレクション:
>>> ((cat < "setup.py") | head["-n", 4])()
u'#!/usr/bin/env python\nimport os\n\ntry:\n'
>>> (ls["-a"] > "file.list")()
u''
>>> (cat["file.list"] | wc["-l"])()
u'17\n'
于 2012-05-16T06:40:02.853 に答える
0

すでに述べたように、これを行う良い方法は subprocess モジュールを使用することです。便利な関数を使用すると、 STDIN/STDOUT/STDERR を再割り当てできますが、I/O パイプがいっぱいになるとデッドロックが発生する可能性がある完了まで自動的にブロックされるcallため、潜在的に危険です。call使用することをお勧めしPopenます:

import subprocess
p = subprocess.Popen( ["svn", "update", "/Users/daverau/titles/or_mm_creating_website_3e"], subprocess.PIPE )
out = p.communicate()[0]  # 0 is STDOUT

ここから、出力を読み取ったり、好きなように操作したりできます。

于 2012-05-05T05:26:41.247 に答える
0

このユースケースには subprocess.call を使用できると思います:

from subprocess import call
print 'Content-Type: text/plain'
print
print 'test...'
response = call(["svn", "update", "/Users/daverau/titles/or_mm_creating_website_3e"])
于 2012-05-05T01:41:06.723 に答える