10

変更された一連の環境変数を使用するシェル経由で別のスクリプトを実行しようとしています。

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 で Python 2.7 を実行しています

4

3 に答える 3

8

この質問を「未回答」フィルターから削除するために、コメントから回答をコピーします。

"... Python 2.x のキー、および場合によっては値もバイト文字列である必要があります。したがって、Unicode 文字列を使用している場合は、それらを にエンコードするようにしてくださいutf-8。また、デフォルトで Unicode リテラルを使用している場合は、辞書キーの文字列リテラルが、Unicode リテラルではなくバイト リテラルになるようにfrom __future__ import unicode_literalsプレフィックスを付けてください。」b

〜ペドロ・ロマーノごとの回答

于 2013-09-25T04:47:31.587 に答える
2

同様の問題に遭遇しました。私の場合、問題は、渡した辞書に python ネイティブ型を渡しただけだったことが原因でしたenv。ここでの情報のレベルを考えると、これは実際には OP と一致している可能性があります。次の点を考慮してください。

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

と呼ばれます。environ似ていたら

{"variable": True}

次に、Trueそこにあることがほぼ確実にエラーの原因になります。その代わりに文字列(他の回答によるとバイト文字列)を使用できます"true"

于 2017-12-20T21:53:17.077 に答える