[Python2.3] Shell Commando uitvoeren

Pagina: 1
Acties:

  • Chewy
  • Registratie: April 2004
  • Laatst online: 26-07-2022
Dit is de tweede avond dat ik hier mee bezig ben, maar ik krijg het maar niet voor elkaar om een shell commando uit te laten voeren door python.
Het gaat om de volgende:
code:
1
`tail -n \`wc -l $datafile | cut -d' ' -f 1 \` $datafile |cut -d',' -f $y |sort|uniq`;

Dit is de syntax voor in perl. Deze voert dit uit, en wat hier uitkomt boeit ff niet (ben ik zelf ff vergeten namelijk :+ )
Maar goed, dit zou er in python lijkt me zo uit moeten zien:

code:
1
args = 'tail -n \`wc -l ', var_datafile, ' \| cut -d\' \' -f 1 \` ', var_datafile, ' \|cut -d -f ', y, '\|sort|uniq'


Om dit vervolgens uit te voeren moet (dacht ik) dit gedaan worden (na wat gezoek op internet):
code:
1
commands.getoutput(args)


Ik heb btw bij de python syntax alle " | " geëscaped omdat zonder escapen hij het ook al niet deed.
Maar in iedergeval, de error die ik hier uit krijg is de volgende:
code:
1
2
3
4
5
File "/usr/lib/python2.3/commands.py", line 44, in getoutput
    return getstatusoutput(cmd)[1]
  File "/usr/lib/python2.3/commands.py", line 53, in getstatusoutput
    pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
TypeError: cannot concatenate 'str' and 'tuple' objects


Hier word ik alleen niet wijzer uit.
Hoe los ik dit op?

btw.
code:
1
commands.getoutput('ls -a')
werkt wel gewoon.

  • TweakBoy
  • Registratie: Augustus 2001
  • Laatst online: 07:28

TweakBoy

---

python ziet in je "string" 2 data types: str [a-zA-Z] & tuple ( waarde , waarde )

dus je hebt toch ergens iets vergeten te escapen

---


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Volgens mij werkt het hele
code:
1
args = 'bla', var, 'argh'

niet. Bij print werkt dat wel, omdat print speciale dingen doet als je er een tuple aan meegeeft. Als je er echter gewoon een lange string van wil maken moet het anders:
code:
1
args = 'bla' + var + 'argh'

of
code:
1
args = 'blah %s argh' % var

Verder heb ik geen ervaring met dat commandtools, maar os.system() zou ook moeten helpen (of anders os.popen()).

[ Voor 18% gewijzigd door djc op 20-02-2006 00:31 ]

Rustacean


  • Semyon
  • Registratie: April 2001
  • Laatst online: 05:04
Ik gebruik inderdaad altijd popen(3) voor dit:

Python:
1
2
3
4
5
6
  cmd="tail -n "+var_datefile ....
  inp,outp,stderr = os.popen3(cmd)
  result=outp.read()
  inp.close()
  outp.close()
  stderr.close()


als je niet in de stderr geintersseert bent kan je ook popen gebruiken..

Only when it is dark enough, can you see the stars


  • Chewy
  • Registratie: April 2004
  • Laatst online: 26-07-2022
Bedankt voor de hulp. Vooral het stukje dat ik + moest gebruiken ipv ,
Daarna heb ik nog wel ff verder zitten stoeien met de syntax, had toch wat dingen over het hoofd gezien.
Maar het ziet er nu zo uit:

code:
1
2
cmd = 'tail -n `wc -l ' + var_file + ' | cut -d \' \' -f 1 ` ' + var_file + '| cut -d \',\' -f ' + str(y) + ' | sort|uniq'
array_kolommen.append(commands.getoutput(cmd))

[ Voor 11% gewijzigd door Chewy op 20-02-2006 22:24 ]


  • DeMoN
  • Registratie: Maart 2001
  • Laatst online: 17-02 18:05

DeMoN

Pastafari

Oud topic (niet zo heeel oud) maar kon het toch niet laten aangezien ik hem tegenkwam.

Behoorlijk moeilijk gedoe hier imho :P

code:
1
cmd = r"`tail -n \`wc -l $datafile | cut -d' ' -f 1 \` $datafile |cut -d',' -f $y |sort|uniq`;"


(ja, die 'r' hoort daar. Geeft aan dat het om een raw string gaat.. dat is de truuk ook ;) Je hoeft dan niks meer te escapen.)

En je bent klaar :)

Uitvoeren kan dan gewoon met os.system(cmd)

(vergeet niet import os te doen ;) )

[ Voor 20% gewijzigd door DeMoN op 21-03-2006 15:33 ]

Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein


  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01-2025

Ivo

Ja, als je moeilijk zit na te denken in Python dan is er altijd wel een makkelijkere manier. :P
Pagina: 1