【问题标题】:Python subprocess not returningPython子进程没有返回
【发布时间】:2016-10-06 15:28:11
【问题描述】:

我想从 Jenkins 调用一个 Python 脚本并让它构建我的应用程序,将其 FTP 到目标,然后运行它。

我正在尝试构建,但 subprocess 命令失败。我用subprocess.call()subprocess.popen() 都试过了,结果是一样的。

当我评估 shellCommand 并从命令行运行它时,构建成功。

请注意,我有 3 个 shell 命令:1) 删除工作目录,2) 创建一个新的空工作目录,然后 3) 构建。前两个命令从subprocess 返回,但第三个挂起(尽管它在从命令行运行时完成)。

我做错了什么?或者,我有什么替代方法来执行该命令?

# +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
def ExcecuteShellCommandAndGetReturnCode(arguments, shellCommand):
    try:
        process = subprocess.call(shellCommand, shell=True, stdout=subprocess.PIPE)
        #process.wait()
        return process #.returncode

    except KeyboardInterrupt, e: # Ctrl-C
        raise e
    except SystemExit, e: # sys.exit()
        raise e
    except Exception, e:
        print 'Exception while executing shell command : ' + shellCommand
        print str(e)
        traceback.print_exc()
        os._exit(1)

# +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
def BuildApplciation(arguments):
    # See http://gnuarmeclipse.github.io/advanced/headless-builds/

    jenkinsWorkspaceDirectory = arguments.eclipseworkspace + '/jenkins'

    shellCommand = 'rm -r ' + jenkinsWorkspaceDirectory
    ExcecuteShellCommandAndGetReturnCode(arguments, shellCommand)

    shellCommand = 'mkdir ' + jenkinsWorkspaceDirectory
    if not ExcecuteShellCommandAndGetReturnCode(arguments, shellCommand) == 0:
        print "Error making Jenkins work directory in Eclipse workspace : " + jenkinsWorkspaceDirectory
        return False

    application = 'org.eclipse.cdt.managedbuilder.core.headlessbuild'
    shellCommand = 'eclipse -nosplash -application ' + application + ' -import ' + arguments.buildRoot + '/../Project/ -build myAppApp/TargetRelease -cleanBuild    myAppApp/TargetRelease -data ' + jenkinsWorkspaceDirectory + ' -D DO_APPTEST'
    if not ExcecuteShellCommandAndGetReturnCode(arguments, shellCommand) == 0:
        print "Error in build"
        return False

【问题讨论】:

    标签: python python-2.7 subprocess


    【解决方案1】:

    我在 Google 上进一步搜索,发现 this page,在 1.2 时显示

    获取执行命令输出的一种方法是 在参数 stdout 或 stderr 中使用 PIPE,但子 如果进程向管道生成足够的输出以填满,则进程将阻塞 操作系统管道缓冲区,因为管道没有被读取。

    果然,当我从上面的代码中删除, stdout=subprocess.PIPE 时,它按预期工作。

    因为我只想要子进程的退出代码,所以上面的代码对我来说已经足够了。如果您想要命令的输出,请阅读链接页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 2016-12-11
      • 2019-05-30
      • 1970-01-01
      相关资源
      最近更新 更多