我有一个执行 python 脚本的 java 应用程序,它在该行失败
cmd = "cmd /c asm.bat < 1.ADD.asm 2> nul"
os.system(cmd)
这在我从 Windows shell 启动 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
。在_execute_child
第 1238 行,_shell_command
为无,导致错误。在到达那里之前,_setup_platform
执行并_get_shell_commands = (['cmd.exe', '/c'], ['command.com', '/c'])
在两种情况下都返回。第一个可执行文件 cmd.exeC:\windows\system32\cmd.exe
由distutils.spawn.find_executable(executable)
while转换为,cmd.exe
并在我从调试器启动我的应用程序时command.com
转换为。基本上迭代env 变量中的所有条目,如果存在这样的文件,则将可执行文件附加到末尾返回结果。但是当应用程序是 Eclipse 启动时,路径 env 是空的,因为我已经覆盖了它。None
distutils.spawn.find_executable(executable)
path
cmd.exe