Thread View: pl.comp.lang.python
5 messages
5 total messages
Started by Piotr Chamera
Wed, 28 Oct 2009 10:52
problem subprocess.call i cudzysłowami
Author: Piotr Chamera
Date: Wed, 28 Oct 2009 10:52
Date: Wed, 28 Oct 2009 10:52
18 lines
1145 bytes
1145 bytes
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
Re: problem subprocess.call i cudzysłowami
Author: Rob Wolfe
Date: Wed, 28 Oct 2009 11:58
Date: Wed, 28 Oct 2009 11:58
46 lines
2308 bytes
2308 bytes
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
Re: problem subprocess.call i cudzysłowami
Author: Piotr Chamera
Date: Wed, 28 Oct 2009 16:31
Date: Wed, 28 Oct 2009 16:31
79 lines
2995 bytes
2995 bytes
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 :(
Re: problem subprocess.call i cudzysłowami
Author: Rob Wolfe
Date: Wed, 28 Oct 2009 17:17
Date: Wed, 28 Oct 2009 17:17
94 lines
3395 bytes
3395 bytes
Piotr Chamera <piotr_chamera@poczta.onet.pl> writes:
> 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 :(
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
Re: problem subprocess.call i cudzysłowami
Author: Michał Politowski
Date: Thu, 29 Oct 2009 15:16
Date: Thu, 29 Oct 2009 15:16
37 lines
2031 bytes
2031 bytes
On Wed, 28 Oct 2009 17:31:24 +0100, Piotr Chamera <piotr_chamera@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.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads