/ / Python subprocess to Bash: kučeravé popruhy - python, bash, popen

Python subprocess to Bash: kučeravé popruhy - python, bash, popen

Mám nasledujúce riadky programu Python:

import subprocess
subprocess.Popen("egrep -r --exclude=*{.git,.svn}* "text" ~/directory", stdout=subprocess.PIPE, shell=True).communicate()[0]

Bohužiaľ, bash úplne ignoruje --exclude = * {. git, .svn} * flag.

Zmenil som problém na vlnité zátvorky --exclude = * .git * bude fungovať cez popton python, ale v okamihu, kedy sú zavedené curly tyče, zostanem bezmocné.

Poznámka: Pokúsil som sa spustiť príkaz pomocou programu Python príkaz knižnica, produkuje presne ten istý výstup - a to isté ignorované - vylučuje príznak.

odpovede:

2 pre odpoveď č. 1

Hádal by som, že by mohlo uniknúť škrupina?

Mohlo by byť najlepšie urobiť vlastné rozdelenie argumentov a úplne sa vyhnúť obálke?

import subprocess
subprocess.Popen(["egrep","-r","--exclude=*{.git,.svn}*","text","~/directory"], stdout=subprocess.PIPE).communicate()[0]

Poznámka: Možno budete musieť rozšíriť ~, Nie som si istý.

Alebo ak má bash rozšíriť zátvorky, potom to urobíte v pytóne:

excludes = [".git",".svn"]
command = ["egrep","-r"]
for e in excludes:
command.append("--exclude=*%s*"%e)
command += ["text","~/directory"]
subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]

3 pre odpoveď č. 2

Keď prejdete shell = True, python preloží príkaz na /bin/sh -c <command> (ako je opísané tu). / bin / sh zrejme nepodporuje roztiahnutie krovín. Namiesto toho môžete skúsiť nasledujúce:

import subprocess
subprocess.Popen(["/bin/bash", "-c", "egrep -r --exclude=*{.git,.svn}* "text" ~/directory"], stdout=subprocess.PIPE).communicate()[0]

0 pre odpoveď č. 3

Musíte citovať tento výraz, aby ste udržali bashod vyhodnotenia v porovnaní s aktuálnym pracovným adresárom, keď ho vypnete. Máte aj chybu s hľadaným výrazom za predpokladu, že hľadáte "text" (s citátmi). Úspech dostane úvodzovky do reťazca Pythonu, ale je potrebné ich znova vykonať, aby ich mohol vidieť.

Tj. ... --exclude="*{.git,.svn}*" \"text\" ...


0 pre odpoveď č. 4

Z perspektívy Python Popen to, čo máš, funguje za predpokladu, že zachytiš výstup v premennej Pythonu:

import subprocess
myOutput = subprocess.Popen("egrep -r --exclude=*{.git,.svn}* "text" ~/directory", stdout=subprocess.PIPE, shell=True).communicate()[0]
print "Output: ", myOutput

Testoval som terminál s príkazom Bash ako predvoleným príkazom Shell a funguje to dobre.

Všimnite si, že "grep -E" by sa malo uprednostniť pred "egrep", ktorý je teraz zastaraný.

A určite viete, že je to aj útekcharakter pre Bash, nie? Myslíš, "*" a kudrlinky sú konzumované Bash, a preto nie sú odovzdané do grep, preto je treba utiecť.

grep -Er --exclude=*{.git,.svn}* "text" ~/directory