Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在subprocess.Popen命令之间维护环境状态?_Python_Command Line_Amazon Ec2_Subprocess_Shellexecute - Fatal编程技术网

Python 在subprocess.Popen命令之间维护环境状态?

Python 在subprocess.Popen命令之间维护环境状态?,python,command-line,amazon-ec2,subprocess,shellexecute,Python,Command Line,Amazon Ec2,Subprocess,Shellexecute,我正在为我们的系统编写一个部署引擎,其中每个项目都指定自己的自定义部署指令 这些节点在EC2上运行 其中一个项目依赖于第三方应用程序的源代码版本 具体而言: cd /tmp wget s3://.../tools/x264_20_12_2010.zip unzip x264_20_12_2010.zip cd x264_20_12_2010 ./configure make checkinstall --pkgname=x264 --pkgversion "2:0.HEAD" --backup=

我正在为我们的系统编写一个部署引擎,其中每个项目都指定自己的自定义部署指令

这些节点在EC2上运行

其中一个项目依赖于第三方应用程序的源代码版本

具体而言:

cd /tmp
wget s3://.../tools/x264_20_12_2010.zip
unzip x264_20_12_2010.zip
cd x264_20_12_2010
./configure
make
checkinstall --pkgname=x264 --pkgversion "2:0.HEAD" --backup=no --deldoc=yes --fstrans=no --default
目前,我正在使用boto的ShellCommand(内部使用subprocess.Popen)执行此操作,如下所示:

def deploy():
        ShellCommand("apt-get remove ffmpeg x264 libx264-dev")
        ShellCommand("apt-get update")
        ShellCommand("apt-get install -y build-essential checkinstall yasm texi2html libfuse-dev fuse-utils libcurl4-openssl-dev libxml2-dev mime-support libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev libvpx-dev libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev")

        ShellCommand("cd /tmp")
        s3cmd_sync("s3://.../tools/x264_20_12_2010.zip", "/tmp/x264_20_12_2010.zip")
        ShellCommand("unzip x264_20_12_2010.zip")
        ShellCommand("cd x264_20_12_2010")
        ShellCommand("./configure")
        ShellCommand("make")
        ShellCommand(r'checkinstall --pkgname=x264 --pkgversion "2:0.HEAD" --backup=no --deldoc=yes --fstrans=no --default')
遗憾的是,这失败了,因为
cd/tmp
应用于子进程,这意味着,一旦我返回父进程并发出第二个shell命令,exeev将从父进程继承,这使我倾向于认为我需要一些shell命令的执行框架,它将在不丢失上下文的情况下在相同的子进程中应用所有命令

这个问题的推荐解决方案是什么?请注意,命令行执行应用程序的日志记录非常重要(没有它,您如何调试?),这就是为什么我喜欢ShellCommand。。。(如有兴趣,请参阅boto日志记录)

谢谢你,
格言

  • 想想os.chdir(“目录”)而不是Popen(“cd目录”)

  • 也许这里最好不要为每个命令执行一个新的shell:只需编写一个多行shell脚本

  • deploy_commands=“”apt get foo 易如反掌 cd baz;boo-bat”“”

    通过Popen结束执行(deploy_命令,shell=True)

    但是请阅读Popen文档中关于不能逃避不受信任的参数的安全警告。

    我最终这样做了

    def shell_script(appname, *commands):
            workspace = tempfile.mkdtemp(prefix=appname + '-')
            installer = open(workspace + "/installer.sh", 'w')
    
            installer.write("#!/bin/bash\n")
            installer.write("cd " + workspace + "\n")
            for line in commands:
                    installer.write(line + "\n")
            ShellCommand("chmod u+x " + installer.name)
            installer.close()
            ShellCommand(installer.name)