使用python subprocess.call运行命令失败,但在cmd.exe中输入时正常成功

0 投票
1 回答
966 浏览
提问于 2025-04-18 06:53

背景是我正在尝试设置一个 Cocos-2dx v3.0 的项目。我已经让创建项目的 Python 脚本运行起来了,现在我想构建并运行这个项目,以便开始开发一个游戏。不过,我遇到的问题是,在运行构建和运行的 Python 脚本时,subprocess.call 发出的一个命令每次都会失败。但是,当我自己在命令行中直接运行这个命令时,它却能正常工作。

在 Python 中调用 subprocess.call 的方法:

@staticmethod
def run_cmd(command, verbose):
    if verbose:
        Logging.debug("running: '%s'\n" % ''.join(command))
    else:
        log_path = CCPlugin._log_path()
        command += ' >"%s" 2>&1' % log_path    
    print "CALLING run_cmd"
    ret = subprocess.call(command, shell=True)
    if ret != 0:
        message = "Error running command, return code: %s" % str(ret)
        if not verbose:
            message += ". Check the log file at %s" % log_path
        raise CCPluginError(message)

这个方法在脚本中被多次使用,并且每次调用都能成功。

这个在 Python 中调用时失败的命令,但在直接输入到命令行时却能正常运行:

"C:\Users\Patrick\Downloads\apache-ant-1.9.4-bin\apache-ant-1.9.4\bin\ant" clean debug -f C:\HyperFusion\RuneWars\RuneWars\proj.android\build.xml -Dsdk.dir="C:\Users\Patrick\COPAP\Software\adt-bundle-windows-x86-20130522\sdk"

任何帮助都非常感谢。我在网上查了很多资料,但没有找到能解决问题的办法。我对 Python 还是很陌生(而且我真的没想到会需要调试,因为这些只是 Cocos 提供的设置脚本),所以如果我遗漏了什么简单的东西,请多多包涵。

操作系统是 Windows 7,不知道这是否与问题有关。

谢谢!

1 个回答

0

我问关于'verbose'标志的原因是有的。如果这个标志设置为'False',可以尝试把下面的一行注释掉:

 else:
    log_path = CCPlugin._log_path()
    # command += ' >"%s" 2>&1' % log_path    

可能会发生的情况是,下一条命令无法打开日志文件进行写入,因为这个文件已经被上一条命令打开了。这可以很好地解释为什么你提到的其他命令都成功了。

这只是一个假设,应该很容易验证。祝你好运!

撰写回答