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: [Opgelost]Python pipes  (gelezen 944 keer)

Offline MKe

  • Lid
  • Steunpunt: Nee
[Opgelost]Python pipes
« Gepost op: 2010/04/21, 16:21:37 »
Hoi,

Weer een python vraagje. Ik wil graag een extern programma starten vanuit Python, b.v. met os.popen. Het probleem is dat dit programma als input een path wil hebben naar een textfile. Maar ik heb geen textfile. De data die ik wil laten verwerken staat in een string, gegenereerd door Python. Nou kan ik natuurlijk deze string in een tijdelijke textfile laten opslaan en dan het commando uitvoeren met een standaard path uit te voeren. Maar dit lijkt me niet de normale manier. Is er een methode om dit te doen zonder temp bestanden aan te maken?
« Laatst bewerkt op: 2010/04/25, 22:11:14 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Offline Nunslaughter

  • Lid
    • timovwb
  • Steunpunt: Nee
Re: Python pipes
« Reactie #1 Gepost op: 2010/04/21, 16:28:16 »
os.popen (en os.system en anderen) zijn vervangen door de Subprocess module. Kijk daar eens naar.

Maar uw probleem ligt eerder aan het programma dat ge wilt aanroepen dan aan uw Python code. Omdat dat programma een bestand verwacht, en geen string.

Offline MKe

  • Lid
  • Steunpunt: Nee
Re: Python pipes
« Reactie #2 Gepost op: 2010/04/21, 16:36:10 »
Bedankt voor je reaktie.
Klopt. Dat is mijn probleem. Ik zie dat subprocess wel pipes ondersteund, maar ik zie nog niet helemaal hoe ik dat in dit geval zou kunnen toepassen.

Offline Ronnie

  • Artworkteam
    • ronnie.vd.c
  • Steunpunt: Nee
Re: Python pipes
« Reactie #3 Gepost op: 2010/04/21, 16:50:17 »
Misschien zoiets mogelijk?

f = open('file', 'w')
f.write(string)
f.close()

p = subprocess.Popen(args)
....
os.remove('file')
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Documentatie Terminal

Offline Nunslaughter

  • Lid
    • timovwb
  • Steunpunt: Nee
Re: Python pipes
« Reactie #4 Gepost op: 2010/04/21, 16:51:17 »
Zijn pipes nodig? Of word het bestand gewoon als argument meegegeven? Dan kan het namelijk gewoon zo (het commando zoals ge het in ed terminal zou typen):

p = subprocess.Popen('prognaam /pad/naar/bestand', shell=True)
Zelf heb ik Subprocess nog niet gebruikt voor meer geavanceerde dingen, dus zou ge eventueel eens in de documentatie of naar voorbeelden moeten kijken.

Offline muksie

  • Lid
  • Steunpunt: Nee
Re: Python pipes
« Reactie #5 Gepost op: 2010/04/21, 17:07:11 »
Wanneer jou externe programma een bestand verwacht, dan vind ik persoonlijk een temp bestand toch de meest nette oplossing, maar dan wel met bijvoorbeeld de tempfile module uit de Python standard library.

Wanneer je externe programma tevens overweg kan met invoer vanuit stdin, dan is het inderdaad netter om subprocess.Popen te gebruiken. Geef dan stdin=PIPE mee aan de constructor, en je kunt je data dan wegschrijven naar het stdin attribuut van je Popen object.

Offline MKe

  • Lid
  • Steunpunt: Nee
Re: Python pipes
« Reactie #6 Gepost op: 2010/04/25, 22:10:11 »
Wanneer jou externe programma een bestand verwacht, dan vind ik persoonlijk een temp bestand toch de meest nette oplossing, maar dan wel met bijvoorbeeld de tempfile module uit de Python standard library.

Wanneer je externe programma tevens overweg kan met invoer vanuit stdin, dan is het inderdaad netter om subprocess.Popen te gebruiken. Geef dan stdin=PIPE mee aan de constructor, en je kunt je data dan wegschrijven naar het stdin attribuut van je Popen object.
Bedankt, 'tempfile' kende ik nog niet en werkt prima.