Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

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

Auteur Topic: subprocess.call  (gelezen 468 keer)

Offline MKe

  • Lid
  • Steunpunt: Nee
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/

Offline Nunslaughter

  • Lid
    • timovwb
  • Steunpunt: Nee
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
  • Steunpunt: Nee
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.

Offline Nunslaughter

  • Lid
    • timovwb
  • Steunpunt: Nee
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
  • Steunpunt: Nee
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.