написать сценарий Python для запуска сценария оболочки? - PullRequest
0 голосов
/ 12 апреля 2011

Я запускаю статус svn, получил измененные файлы:

  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, который может запускать оболочку, потому что сейчас, чтобы сделать это, я просто скопирую имя файла по одному.

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

Кто-нибудь может подсказать, как это сделать или какой-то связанный учебник?Но если вы думаете, это difficult than copy && paste Я проигнорирую мои попытки?

спасибо

Ответы [ 4 ]

2 голосов
/ 12 апреля 2011

Я не понимаю, зачем вам использовать Python для этого, если вы можете сделать это в одной строке кода в оболочке.

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

Я использовал grep только для выбора измененных строк, если вы хотите, чтобы все файлы, которые имеют списки состояния SVN (также те, которые были добавлены / удалены), вы можете пропустить эту часть. Я использовал sed здесь, чтобы удалить первую часть каждой строки, я уверен, что есть более простой способ сделать это, но сейчас я не могу придумать одну из них.

0 голосов
/ 12 апреля 2011

Вы можете использовать функции 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 см. <a href="/203584/vypolnenie-sistemnogo-vyzova-kotoryi-vozvraschaet-vyvod-stdout-v-vide-stroki#203626">check_output() рецепт .

0 голосов
/ 12 апреля 2011

subprocess - это путь Pythonic, но использование однострочного небольшого 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()
0 голосов
/ 12 апреля 2011

Как только вы определите свою команду как строку, вы можете просто вызвать ее с помощью подпроцесса

подпроцесс

Этот модуль порождает вызванные процессы и позволяет вам управлять ими.Оттуда до вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...