1

我有一个执行 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.exedistutils.spawn.find_executable(executable)while转换为,cmd.exe并在我从调试器启动我的应用程序时command.com转换为。基本上迭代env 变量中的所有条目,如果存在这样的文件,则将可执行文件附加到末尾返回结果。但是当应用程序是 Eclipse 启动时,路径 env 是空的,因为我已经覆盖了它。Nonedistutils.spawn.find_executable(executable)pathcmd.exe

4

2 回答 2

0

我必须mypath;${env_var:PATH}在应用程序启动配置中使用,如https://stackoverflow.com/a/17673245/1083704中所述。

于 2013-11-07T16:36:39.467 回答
0

在 Windows 上,我遇到了类似的问题。那是因为PATH环境变量被修改了,丢失了

'%SystemRoot%\system32;%SystemRoot%;'

于 2014-01-10T11:01:17.277 回答