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ď č. 1Há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