编写python脚本来运行shell脚本?

时间:2011-04-12 14:26:18

标签: python shell

我运行svn status得到了修改过的文件:

  svn status
  ?       .settings
  ?       .buildpath
  ?       .directory
  A       A.php
  M       B.php
  D       html/C.html
  M       html/D.fr
  M       api/E.api
  M       F.php
  ..

我想保留所有这些文件

zcvf MY.tar.gz all files that svn stat display (不包括?只是M,A,D)

我的想法是创建python脚本可以运行shell,因为现在要做到这一点我只是逐个复制文件名。

zcvf MY.tar.gz all the files that we run svn stat

任何人都可以指导如何做这个或一些相关的教程?但如果你认为difficult than copy && paste我会忽略我的尝试吗?

感谢

4 个答案:

答案 0 :(得分:2)

如果您可以在shell中的单行代码中执行此操作,我不明白为什么要使用python。

svn status | grep "^[AMD]" | sed 's/^.\{8\}//' | xargs zcvf My.tar.gz

我使用grep仅选择已修改的行,如果您希望所有svn状态列表(也包括已添加/删除的文件)的文件都可以将该部分保留。我在这里使用sed来删除每行的第一部分,我确信有一种更简单的方法可以做到这一点,但我现在想不到。

答案 1 :(得分:0)

一旦你把你的命令想成一个字符串,你就可以用子进程

来调用它

subprocess

此模块生成称为进程并允许您控制它们。从那里到你。

答案 2 :(得分:0)

subprocess是Pythonic的方式,但使用一个小的bash单行可能是一个较短的想法。

Bash one-liner

svn status | egrep "^  M" | awk '{s=s $2 " "} END {print "tar cvfz MY.tar "s}'

子过程

import subprocess as sp
p=sp.Popen('svn status', shell=True, stdout=sp.PIPE, 
                                     stderr=sp.PIPE).communicate()[0]
files=[]
for line in p:
     if line.strip().find('M')==0:
          files.append(line.split(' ')[1].strip())

files=' '.join(files)
sp.Popen('tar cvfz MY.tar.gz '+files, shell=True).communicate()

答案 3 :(得分:0)

您可以使用check_output()check_call()函数:

#!/usr/bin/env python
from subprocess import check_call, check_output as qx

filenames = [line[8:] # extract filename
             for line in qx(['svn', 'status']).splitlines()
             if not line.startswith('?')] # exclude files that are not under VC
check_call(['tar', 'cvfz', 'MY.tar.gz'] + filenames)

在Python上< 2.7见check_output() recipe