2012-11-03 5 views
9

変更された環境変数セットを使用するシェル経由で別のスクリプトを実行しようとしています。上記のコードを実行した後subprocess.Popen execve()arg 3には文字列以外の値が含まれています

def cgi_call(script, environ): 
    pSCRIPT = subprocess.Popen(script, stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
         stdin=subprocess.PIPE, env=environ, shell=True) 

    pc = pSCRIPT.communicate() 

    status = "200 OK" 
    headers = [('Content-Type',"text/html")] 
    if pc[1] != '': 
     raise RuntimeError, pc[1] 
    else: 
     rval = str(pc[0]) 

    return status, headers, rval 

、私は次のエラーを取得する:

File "server/httpd.py", line 76, in DynamicServer 
    status, headers, rval = handler(environ) 
File "server/httpd.py", line 43, in handler 
    status, headers, rval = cgi_call(srvpath+"../www/public_html"+environ["PATH_INFO"]+'index.py',environ) 
File "server/httpd.py", line 21, in cgi_call 
    stdin=subprocess.PIPE, env=environ, shell=True) 
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
<type 'exceptions.TypeError'> execve() arg 3 contains a non-string value 

環境変数を渡すときにエラーが付属しています...私も文字列として渡す試してみた - それはエラーそれがマッピングオブジェクトを必要としていると言います。しかし、それがそのまま渡される環境はマッピングオブジェクトです...

何が問題なのですか?

追加情報: 私は「未回答」フィルタからこの質問を削除するために、コメントからの回答をコピーするのUbuntu 12.04.1

+6

'execve()arg 3'は環境です。あなたが渡している 'env'パラメータには文字列しか含まれていませんか? –

+0

はい、私は肯定的です。それが私がチェックした最初のものでした。 –

+10

私は確信していませんが、少なくともPython 2.xのキーと、場合によっては値もバイト文字列である必要があります。ユニコード文字列を使用している場合は、それらを 'utf-8'にエンコードしてください。また、 'from __future__ import unicode_literals'でデフォルトでUnicodeリテラルを使用している場合は、辞書キーの文字列リテラルにUnicodeリテラルではなく、バイトリテラルである' b'を接頭辞として付けるようにしてください。 –

答えて

7

でPython 2.7を実行しています:

」...また、Unicodeリテラルをデフォルトでfrom __future__ import unicode_literalsで使用している場合は、あなたがUnicode文字列を使用していることを確認してください。辞書キーの文字列リテラルには、Unicodeリテラルではなく、バイトリテラルになるように接頭辞bが付きます。

〜私は同様の問題に遭遇したPedro Romano

+0

ありがとう@DreadPirateShawn。 –

0

あたりの答え。私の場合、問題は、私がenvに渡した辞書にPythonのネイティブタイプを渡していたためです。これは、ここでの情報のレベルを考えれば、OPと実際に一致する可能性があります。

cgi_call(srvpath+"../www/public_html"+environ["PATH_INFO"]+'index.py',environ) 

と呼ばれるポイントを考えてみましょう。 environ

{"variable": True} 

ように見えたなら、Trueでは、ほぼ確実にエラーの原因があるだろう。代わりに、文字列(別の答えとして、bytestring)"true"を使用することができます。

関連する問題