Pythonスクリプトを実行するJavaアプリケーションがありますが、次の行で失敗します
cmd = "cmd /c asm.bat < 1.ADD.asm 2> nul"
os.system(cmd)
これは、Windows シェルから Java アプリを起動したときに機能しましたが、Eclipse デバッガー内からアプリを実行すると失敗します。
RuntimeWarning: Unable to determine _shell_command for underlying os: nt.
私も試しcmd = "asm.bat < 1.ADD.asm 2> nul"
ましたが、同じエラーが発生しました。
完全なスタック トレースは次のとおりです。
File "MyScript.py", line 73, in runTestFile
os.system("cmd.exe")
File "C:\mycad\share\python\Lib\subprocess.py", line 456, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\mycad\share\python\Lib\subprocess.py", line 753, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\mycad\share\python\Lib\subprocess.py", line 1238, in _execute_child
args = _shell_command + args
TypeError: unsupported operand type(s) for +: 'NoneType' and 'lis
subprocess.py の 456 行目はこちら
def call(*popenargs, **kwargs):
"""Run command with arguments. Wait for command to complete, then
return the returncode attribute.
The arguments are the same as for the Popen constructor. Example:
retcode = call(["ls", "-l"])
"""
return Popen(*popenargs, **kwargs).wait() # line 456
os.py に os.system() が見つからず、代わりにos.system("cmd.exe")
呼び出しcall
関数が見つからないのは興味深いことです。subprocess.py
の1238_execute_child
行目_shell_command
は None であり、エラーが発生します。そこに到達する前に実行され、どちらの場合も_setup_platform
返されます。_get_shell_commands = (['cmd.exe', '/c'], ['command.com', '/c'])
最初の実行可能 cmd.exe は while によって変換さC:\windows\system32\cmd.exe
れ、distutils.spawn.find_executable(executable)
デバッガーからアプリを起動するcmd.exe
とcommand.com
に変換されます。基本的にenv 変数のすべてのエントリを繰り返し、実行可能ファイルを最後に添付して、そのようなファイルが存在する場合は結果を返します。しかし、パス env は、オーバーライドしたため、アプリが Eclipse で開始されたときに空になります。None
distutils.spawn.find_executable(executable)
path
cmd.exe