4

経由でQProcessコマンドを渡すことができないようです。他のコマンドラインアプリも試しました。cmd.exestdin

試してデバッグするために使用する簡単なコードを次に示します。

prog = "c:/windows/system32/cmd.exe"
arg = [""]
p = QtCore.QProcess()
retval = p.start(prog, arg)
print retval
print p.environment()
print p.error()
p.waitForStarted()
print("Started")
p.write("dir \n")
time.sleep(2)
print(p.readAllStandardOutput())
print(p.readAllStandardError())
p.waitForFinished()
print("Finished")
print p.ExitStatus()

出力:

None
[]
PySide.QtCore.QProcess.ProcessError.UnknownError
Started

{時を経て}

Finished
PySide.QtCore.QProcess.ExitStatus.NormalExit
QProcess: Destroyed while process is still running.

" dir \n" コマンドは一度も発行されていないのでしょうか?

4

2 に答える 2

0

コードにはいくつかの問題があります。

  1. 空の文字列を引数として渡すことは(明らかに)良い考えではありません
  2. start(...)メソッドは値を返しませんwaitForStarted()が、
  3. readAllStandardOutput()呼び出しを呼び出す前にwaitForReadyRead()
  4. waitForFinished()プロセス(cmd.exe)を実際に終了させない限り、戻りません(または単にタイムアウトします)

これは、例の線に沿った最小限の動作バージョンである必要があります。

from PySide import QtCore

prog = "cmd.exe"
arg = []
p = QtCore.QProcess()
p.start(prog, arg)
print(p.waitForStarted())

p.write("dir \n")
p.waitForReadyRead()
print(p.readAllStandardOutput())

p.write("exit\n")
p.waitForFinished()
print("Finished: " + str(p.ExitStatus()))
于 2013-02-25T18:20:10.240 に答える
0

出力を読み取る前に、書き込みチャネルを閉じる必要があるようです。

これはWinXPで私にとってはうまくいきます:

from PySide import QtCore

process = QtCore.QProcess()
process.start('cmd.exe')

if process.waitForStarted(1000):

    # clear version message
    process.waitForFinished(100)
    process.readAllStandardOutput()

    # send command
    process.write('dir \n')
    process.closeWriteChannel()
    process.waitForFinished(100)

    # read and print output
    print process.readAllStandardOutput()

else:
    print 'Could not start process'
于 2012-11-23T02:45:27.317 に答える