用Python脚本运行Shell脚本?

0 投票
4 回答
935 浏览
提问于 2025-04-16 15:34

我运行了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 所有在svn stat中显示的文件 (不包括状态为?的文件,只包括M、A、D状态的文件)

我的想法是创建一个Python脚本来运行这个命令,因为现在我只能一个一个地复制文件名。

zcvf MY.tar.gz 所有在svn stat中显示的文件

有没有人能指导我怎么做,或者提供一些相关的教程?不过如果你觉得这比复制粘贴要难,我就不想尝试了。

谢谢!

4 个回答

0

subprocess 是在Python中处理子进程的标准方法,但用一行简单的bash命令可能会更简洁。

一行bash命令

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()
1

一旦你把命令弄成了一个字符串,你就可以用subprocess来调用它。

subprocess

这个模块可以启动你调用的进程,并让你控制它们。接下来就看你怎么用了。

2

我不明白为什么你要用Python来做这个,如果你可以在命令行里用一行代码就搞定的话。

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

我用了grep来只选择那些被修改过的行,如果你想要svn状态列出的所有文件(包括那些被添加或删除的),你可以不加这一部分。我在这里用了sed来删除每一行的第一部分,我相信还有更简单的方法,但我现在想不起来了。

撰写回答