🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#26918
Author: Piotr Chamera
Date: Wed, 28 Oct 2009 10:52
18 lines
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
#26919
Author: Rob Wolfe
Date: Wed, 28 Oct 2009 11:58
46 lines
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
#26920
Author: Piotr Chamera
Date: Wed, 28 Oct 2009 16:31
79 lines
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
#26921
Author: Rob Wolfe
Date: Wed, 28 Oct 2009 17:17
94 lines
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
#26922
Author: Michał Politowski
Date: Thu, 29 Oct 2009 15:16
37 lines
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