Mam problem z uzyskaniem wywo�ania r�wnowa�nego temu:
program "a"/"b"@c
z parametrami a b i c, a i b musz� by� w cudzys�owiu
w subprocess.call, pr�bowa�em tak
subprocess.call(['program', '"%s"/"%s"@%s' % (a, b, c)])
ale coďż˝ jest nie tak a nie wiem jak sprawdziďż˝
jak wygl�da rzeczywiste wywo�anie przy takim zapisie parametr�w.
pomo�ecie?
pozdrawiam
Piotr Chamera
Proponuje napisac sobie prosty programik typu:
# take_params.py
import sys
print sys.argv[1:]
i odpowiedziec sobie na pytanie jak powinny wygladac poszczegolne
elementy listy `sys.argv`.
Wtedy wykonac wywolanie:
# test.py
from subprocess import call
a , b , c = 'aaa', 'bbb', 'ccc'
call(['python', 'take_params.py', '"%s"/"%s"' % (a, b), '@%s' % c])
call(['python', 'take_params.py', '%s/%s' % (a, b), '@%s' % c])
call(['python', 'take_params.py', a, '/', b, '@%s' % c])
i zobaczyc co sie wydarzy:
$ python test.py
['"aaa"/"bbb"', '@ccc']
['aaa/bbb', '@ccc']
['aaa', '/', 'bbb', '@ccc']
Ktorys z tych wariantow wywolania `call` powinien wystarczyc.
Jesli nie, to pokaz dlaczego.
RW
Teoretycznie jest tak jak by� powinno, kod mam mniej wi�cej taki:
uruchamianym programem jest 'sqlplus' z Oracle.
sqlplus = '/sciezka/sqlplus'
sql = '@/home/sciezka/praca.sql'
takie wywo�anie dzia�a
>>> call([sqlplus, '%s/%s@adres_bazy' % % ('user', 'haslo'), sql])
takie, nie dzia�a - oracle krzyczy �e nieprawid�owy user/has�o
>>> call([sqlplus, '"%s"/"%s"@adres_bazy' % % ('user', 'haslo'), sql])
przy wywo�aniu w shellu obie formy
/sciezka/sqlplus user/haslo@adres_bazy @/home/sciezka/praca.sql
i
/sciezka/sqlplus "user"/"haslo"@adres_bazy @/home/sciezka/praca.sql
dajďż˝ ten sam wynik.
Programik testowy dla 1 przypadku pokazuje
>>> call(['python', 'test.py', sqlplus, '%s/%s@adres_bazy' % ('user',
'haslo'), sql])
['/sciezka/sqlplus', 'user/haslo@adres_bazy', '@/home/sciezka/praca.sql']
0
czyli jest OK
a dla drugiego
>>> call(['python', 'test.py', sqlplus, '"%s"/"%s"@adres_bazy' %
('user', 'haslo'), sql])
['/sciezka/sqlplus', '"user"/"haslo"@adres_bazy',
'@/home/sciezka/praca.sql']
0
czyli teoretycznie teďż˝ jest OK.
Ale jaka� r�nica jest, nie wiem tylko gdzie :(
B��d le�y pewnie zupe�nie gdzie indziej. Jaki jest konkretnie b��d?
Pr�bowa�e� odpala� poprzez shell-a:
call('python test.py sqlplus %s/%s@adres_bazy %s' % ('user',
'haslo', sql), shell=True)
?
Mo�e chodzi� np. o jakie� zmienne �rodowiskowe.
RW
W shellu, to znaczy w shellu unixowym?
W takim razie to nic dziwnego. Aplikacja nawet nie widzi tych cudzys�ow�w,
interpretuje je sam shell.
$ cat > tp.py
#!/usr/bin/python
import sys
print sys.argv[1:]
$ ./tp.py user/haslo@adres_bazy
['user/haslo@adres_bazy']
$ ./tp.py "user"/"haslo"@adres_bazy
['user/haslo@adres_bazy']
dopiero np. coďż˝ takiego da inny wynik:
$ ./tp.py \"user\"/\"haslo\"@adres_bazy
['"user"/"haslo"@adres_bazy']
No i skoro wynik jest ten sam, to dlaczego musisz mie� cudzys�owy?
--
Michaďż˝ Politowski
Talking has been known to lead to communication if practiced carelessly.