2012-03-03 2 views
1

Есть ли способ, я могу выполнить в питоне команду Баша с расширением: *подпроцесс команды оргии с *

Я попробовал тысячи способов, не повез.

На самом деле я хочу иметь скрипт python which входит в каждый каталог в текущем каталоге и выполняет заданную команду bash (возможно, команда bash с расширением: *).

+1

Возможный дубликат [Выполнение командной строки Python] (http://stackoverflow.com/questions/7306178/python-command-line-execution) –

+0

На самом деле сложно сказать, как решить вашу проблему, не видя кода. –

+0

@ IgnacioVazquez-Abrams: Я не думаю, что это квалифицируется как дубликат, потому что ответ тот же. Мы хотим, чтобы люди могли искать вопрос, а не ответ, верно? –

ответ

3
import os 
from subprocess import check_call 

cmd = 'echo *' # some shell command that may have `*` 
for dirname in filter(os.path.isdir, os.listdir(os.curdir)): 
    check_call(cmd, shell=True, cwd=dirname) 
  • filter(os.path.isdir, os.listdir(os.curdir)) список всех подкаталогов текущего каталога, включая те, которые начинаются с точки (.)
  • shell=True выполняет команды, заданной в cmd строка через оболочку. * если присутствует, расширяется за счет оболочки, как обычно
  • cwd=dirname говорит о том, что команда должна быть выполнена в dirname каталоге
+0

Он работает точно так, как я хотел, но почему нет ничего о 'cwd' arg' check_call' в [python docs] (http://docs.python.org/library/subprocess.html#subprocess.check_call). – Adobe

+1

@Adobe: документы явно упоминают * «Полная подпись функции такая же, как у конструктора [Popen] (http://docs.python.org/library/subprocess.html#popen-constructor) - эти функции проходят все предоставленные аргументы напрямую через этот интерфейс.«* – jfs

1

ли вы, возможно, есть использование для glob module?

>>> import glob 
>>> glob.glob("*") 
['build', 'DLLs', 'Doc', 'ez_setup.py', 'foo-bar.py', 'include', 'Lib', 'libs','LICENSE.txt', 'NEWS.txt', 'python.exe', 'pythonw.exe', 'README.txt', 'Removesetuptools.exe', 'Scripts', 'selectitems.py', 'selectitems.pyc', 'setuptools-wininst.log', 'share', 'so_vector.py', 'tcl', 'Tools', 'w9xpopen.exe'] 
>>> 
+0

Я знаю glob, но я хотел дать команду bash в качестве аргумента для скрипта python. – Adobe

1

Поскольку вы будете иметь оболочку выполнить команду, пусть оболочка сделать расширение метасимволы оболочки. Вы можете запустить:

sh -c "your_commaand -with *" 

Оболочка обработает вам глобусы и выполнит команду.

Это не дает вам проблем с перемещением подкаталогов текущего каталога. Для этого должен быть модуль Python.

Если вы решили, что ваша программа должна chdir() в подкаталоги, вы должны быть осторожны, чтобы вернуться в стартовый каталог после обработки каждого из них. Кроме того, оболочка может иметь дело с этим для вас, тоже с помощью:

sh -c "cd relevant-subdir; your_command -with *" 

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

+0

+1: мне никогда не приходило в голову, что я мог бы накормить его до« bash -c ». – Adobe