правильная обработка оболочки, выходящей из Python с использованием os.system - PullRequest
5 голосов
/ 05 декабря 2011

У меня проблемы с правильным вызовом оболочки в Python при помощи команды os.system. Я пытаюсь сделать эквивалент:

$ cat test | sort --stable -t $'\t' -k1,1

из Python, передавая это в оболочку.

Я пытался:

import os
cmd = "cat %s | sort --stable -t $'\\t' -k1,1" %("test")
os.system(cmd)

но я получаю ошибку:

sort: multi-character tab `$\\t'

хотя из оболочки работает правильно. Я попытался избежать \t, добавив дополнительную косую черту в Python, но я должен упустить что-то еще. Любая идея, как это можно исправить?

спасибо.

Ответы [ 2 ]

5 голосов
/ 06 декабря 2011

os.system не выполняет команды в обычной среде bash, как вы ожидаете. Вы можете обойти это, просто позвонив bash самостоятельно:

import os
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test"
os.system(cmd)

Но вы должны знать, что os.system помечен как устаревший и будет удален в будущих версиях python. Вы можете защитить свой код в будущем, используя subprocess удобный метод call, который имитирует поведение os.system:

import subprocess
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test"
subprocess.call(cmd, shell=True)

Есть другие способы сделать этот вызов с помощью модуля подпроцесса, если вы заинтересованы:

http://docs.python.org/library/subprocess.html#module-subprocess

1 голос
/ 08 декабря 2011

Во-первых, вам следует избегать бесполезного использования кошки: http://google.com/search?q=uuoc.

Во-вторых, вы уверены, что ваша команда сортировки не понимает обратную косую черту? Это должно работать:

sort --stable -t'\t' -k1,1 test

Он также должен нормально работать с Python:

os.system("sort --stable -t'\\t' -k1,1 test")
# or
os.system(r"sort --stable -t'\t' -k1,1 test")

Наконец, если вы переключитесь на subprocess (рекомендуется), избегайте использования shell=True:

subprocess.call(["sort", "--stable", "-t\t", "-k1,1", "test"])
...