Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: subprocess.call  (gelezen 875 keer)

Offline MKe

  • Lid
subprocess.call
« Gepost op: 2015/07/24, 15:26:00 »
Ik snap niet helemaal hoe subprocess werkt.

>> import subprosess
>> # probeer een simpele echo
>> # maak list van commando
>> cmd = 'echo "test" > blaat.txt'.split()
>> # run met call
>> subprocess.call(cmd)
"test" > blaat.txt
Ik zou verwachten dat er een bestandje aangemaakt zou zijn die 'blaat.txt' heet en 'test' bevat als tekst. Maar dat is niet zo. Er is geen bestand aangemaakt. Waarom is dit?

btw, cmd="touch blaat.txt".split() werkt wel. er wordt gewoon een bestand aangemaakt.

ps. natuurlijk wil ik niet echt tekst gaan echo-en naar een file als ik dat ook met filehandlers kan doen. Maar dit is een python wrapper script voor een pipeline en ik ik moet er ook rekening mee houden dat sommige commando's (die ik nu nog niet weet) in de pipeline een redirect moeten doen naar een file of wat ook.
« Laatst bewerkt op: 2015/07/24, 16:07:24 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Re: subprocess.call
« Reactie #1 Gepost op: 2015/07/24, 20:40:16 »
Subprocess kan soms complex zijn. Het probleem hier is de redirect (>) operator.

Dit werkt:
>>> import subprocess
>>> cmd = 'echo "test" > blaat.txt'  # Geen split()
>>> subprocess.call(cmd, shell=True)  # Uitvoeren in de shell
0
>>> import os; os.path.exists("blaat.txt")
True

Door de redirect operator moet het commando in de shell uitgevoerd worden waardoor het ook niet nodig is om het commando te splitsen.

Citaat
The shell argument (which defaults to False) specifies whether to use the shell as the program to execute. If shell is True, it is recommended to pass args as a string rather than as a sequence.

Begrijp ik het goed dat alleen subprocess gebruikt kan worden? Alles kan natuurlijk ook met pure Python modules of zelfs redirects en pipes gebruiken met subprocess.
Uw voorbeeld:
>>> with open("blaat2.txt", "w") as outfile:
...     subprocess.call('echo "test"', stdout=outfile, shell=True)
...
0
>>> import os; os.path.exists("blaat2.txt")
True

De documentatie zou normaal zo goed als alle mogelijkheden omvatten.

Offline MKe

  • Lid
Re: subprocess.call
« Reactie #2 Gepost op: 2015/07/24, 22:06:46 »
Ik wil het zo flexibel mogelijk hebben.. In principe moeten alle bash commando's uitgevoerd kunnen worden.  De commando's staan in een lijst en worden door anderen gemaakt. Ik weer dus niet nu al welke commando's pipes of  redirects zulen hebben.

Maar erg bedankt voor je verhelderende uitleg. Het was mij niet zo duidelijk.

Re: subprocess.call
« Reactie #3 Gepost op: 2015/07/24, 22:38:00 »
Pas wel goed op met zomaar commandos uit te voeren die door anderen worden gemaakt. Lees even dit kleine stukje over shell=True: https://docs.python.org/3.4/library/subprocess.html#security-considerations

Hier de link naar de hoofdpagina: https://docs.python.org/3.4/library/subprocess.html#module-subprocess

Offline MKe

  • Lid
Re: subprocess.call
« Reactie #4 Gepost op: 2015/07/25, 08:19:03 »
Ja, dat veilgheidsprobleem is duidelijk. Gelukkig zijn de anderen vertrouwde leden van een groep. Verder ben ik van plan om de commando's in een besloten docker container met speciale rechten te laten runnen m.b.v. Celery.