Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

problem subprocess.call i cudzysłowami

8 views
Skip to first unread message

Piotr Chamera

unread,
Oct 28, 2009, 6:52:08 AM10/28/09
to
Witam

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

Rob Wolfe

unread,
Oct 28, 2009, 7:58:28 AM10/28/09
to
Piotr Chamera napisał(a):
> Witam
>
> Mam problem z uzyskaniem wywolania rownowaznego temu:

>
> program "a"/"b"@c
>
> z parametrami a b i c, a i b musza byc w cudzyslowiu
> w subprocess.call, probowalem tak

>
> subprocess.call(['program', '"%s"/"%s"@%s' % (a, b, c)])
>
> ale cos jest nie tak a nie wiem jak sprawdzic
> jak wyglada rzeczywiste wywolanie przy takim zapisie parametrow.
>
> pomozecie?

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

Piotr Chamera

unread,
Oct 28, 2009, 12:31:24 PM10/28/09
to
Rob Wolfe pisze:
> Piotr Chamera napisaďż˝(a):

>> Mam problem z uzyskaniem wywolania rownowaznego temu:
>> program "a"/"b"@c ...

>
> 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.

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 :(

Rob Wolfe

unread,
Oct 28, 2009, 1:17:07 PM10/28/09
to
Piotr Chamera <piotr_...@poczta.onet.pl> writes:


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

Michał Politowski

unread,
Oct 29, 2009, 11:16:21 AM10/29/09
to
On Wed, 28 Oct 2009 17:31:24 +0100, Piotr Chamera <piotr_...@poczta.onet.pl> wrote:
[...]

> 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.

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.

0 new messages