5

私はPython 2.7を使用しています

Python から StatTransfer プログラムを実行しようとしています。

私がしようとすると:

tempname = os.path.abspath('./text.txt')
TEMPFILE = open(tempname, 'wb')
try:
    subprocess.check_call('ST convert.stc', shell = True, stdout = TEMPFILE, stderr = TEMPFILE)
except:
    raise CritError(messages.crit_error_bad_command)

失敗します (CritError はユーザー定義です)。

トレースバックは私に有用なことを何も教えてくれません:

Traceback (most recent call last):
  File "C:\...\py\run_program.py", line 181, in run_stcmd
    run.execute_run(current_directory, posix_command, nt_command)
  File "C:\...\py\private\runprogramdirective.py", line 99, in execute_run
    raise CritError(messages.crit_error_bad_command)
CritError: 'ERROR! Cannot execute command'

ただし、関連する行を次のように変更します。

subprocess.call('ST convert.stc', shell = True, stdout = TEMPFILE, stderr = TEMPFILE)

正常に実行されます。

面白いことに、両方のケースで TEMPFILE に同じことが表示されます。

|/-|/-|/-|/-|/- |/-|/-|/-|/-|/- Stat/Transfer - Command Processor (c) 1986-2011 Circle         Systems, Inc.
www.stattransfer.com 
Version 10.1.1866.0714 (32 Bit) - 64 Bit Windows

Serial: ADR4H-L3A3A-N8RJ
User:   XXXXXXXXXXX
Your license is in its grace period -- Please call Circle Systems
Your program will die at the end of the month
Status: Temporarily OK (Expired May 31, 2012)
Transferring from SPSS Portable File: ..\orig\10908970\ICPSR_03775\DS0001\03775-0001-    Data.por
Input file has 26 variables
Optimizing...
Transferring to Stata: ..\data\ABCFeb.dta

504 cases were transferred(0.02 seconds)

Windows コマンド ラインから "st convert.stc" を実行すると、問題なく実行され、上記と同じログ メッセージが表示されることに注意してください。convert.stc 内に書かれていることを実現します。

これは、StatTransfer プログラムが subprocess.check_call で呼び出されたことを示しています。ただし、最後にエラーがあります。これはどのようなエラーですか? どうすれば回避できますか? 2 つのコマンドのどちらを使用する必要があり、その理由は?

ETA : 以下のmgilsonに従って、subprocess.call から値を返し、-1 を取得します。これは何を意味するのでしょうか?プログラムがまだ実行されていて、実際のエラーに気付かなかったのはなぜですか?

ここでこれを行う方法について可能な説明と提案はありますか?

ありがとう。

4

1 に答える 1

6

おそらく起こっていることは、プロセスがゼロ以外の終了ステータスで終了していることです。確認するには、で実行しretcode=subprocess.call(...)てから印刷しますretcode

subprocess.check_callretcode(上記)がゼロ以外の場合、例外が発生します。

表示されている例外はraise subprocess.CalledProcessError、try/except句のからのものです。

>>> import subprocess 
>>> raise subprocess.CalledProcessError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 3 arguments (1 given)

編集

例外をキャッチして別の例外をスローしているので(つまり、元のメッセージのすべての情報が失われる)、try/except句を書き直します。

次のようなものを試してください:

try:
    subprocess.check_call('ST convert.stc', shell = True, stdout = TEMPFILE, stderr = TEMPFILE)
except Exception as e:
    raise CritError(messages.crit_error_bad_command+' '+str(e))

これにより、元のメッセージの情報の一部(すべてではない)が引き続き提供されます。問題はおそらく、サブプログラムがゼロ以外の終了コードで終了していることです。たぶんそれは大丈夫です(それがあなたがしたいことを達成したことを確認してください)。

コマンドラインからコマンドを実行できるとおっしゃいましたが、すべて問題ないようです。Windowsコマンドラインからも終了ステータスを確認することで、動作が同じであることを確認できます(Windowsコマンドラインからアプリケーションの終了コードを取得するにはどうすればよいですか?)。終了ステータスはまだ-1だと思います-そうでない場合、プログラムは環境(環境変数など)と相互作用していますが、Pythonを使用して呼び出すとどういうわけか異なります。

最終的に、プログラムが希望どおりに動作し、終了ステータスを気にしない場合は、を使用する必要がありsubprocess.callますが、プログラムの終了コードについてはマニュアルを参照し、の終了ステータスを確認することをお勧めします。 -1は実際には意味します。

于 2012-06-12T02:16:54.380 に答える