2011-09-30 12 views
12

Mam witrynę django, gdzie muszę wywołać skrypt przy użyciu podprocesu. Wezwanie podproces działa, gdy używam znaków ASCII, ale gdy próbuję wydać argumenty, które są zakodowane w UTF-8, pojawia się błąd:Python subprocess i unicode execv() arg 2 muszą zawierać tylko ciągi znaków

execv() arg 2 must contain only strings. 

Ciąg u'Wiadomo\u015b\u0107' przychodzą od PostgreSQL db. Ten przykład używa polskich słów. Kiedy uruchamiam go przy użyciu angielskich słów, nie mam żadnych problemów.

Połączenie wygląda następująco:

subprocess.Popen(['/usr/lib/p3web2/src/post_n_campaigns.py', '-c', u'bm01', '-1', u'Twoja', '-2', u'Wiadomo\u015b\u0107', '-3', u'', '-4', u'', '-5', u'', '-6', u'', '-m', u'pl', '-p', 'yes']) 

nie jestem pewien, jak radzić sobie sznurki w tym przypadku. Dziwne jest to, że działa to dobrze, gdy uruchamiam go przez interpretera python.

Odpowiedz

17

Powinieneś kodować ciągi Unicode w kodowaniu, jakiego oczekuje twój program. Jeśli znasz program oczekuje UTF-8:

u'Wiadomo\u015b\u0107'.encode('utf8') 

Jeśli nie wiesz, co trzeba kodowania, można spróbować domyślne kodowanie swojej platformy:

u'Wiadomo\u015b\u0107'.encode() 
+3

dzięki że załatwiło sprawę ... Myślałem, że jest już zakodowana ... lekcja się nauczyła. – deecodameeko