11

次の例を検討してください。

>>> import subprocess as sp
>>> sp.Popen("notepad2.exe",env={"PATH":"C:\\users\\guillermo\\smallapps\\bin"})
<subprocess.Popen object at 0x030DF430>
>>> sp.Popen("notepad2.exe",env={"PATH":u"C:\\users\\guillermo\\smallapps\\bin"})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\subprocess.py", line 633, in __init__
    errread, errwrite)
 File "C:\Python26\lib\subprocess.py", line 842, in _execute_child
   startupinfo)
TypeError: environment can only contain strings

エラーをこの CPython コードまでさかのぼりました。

http://hg.python.org/cpython/file/ca54c27a9045/Modules/_winapi.c#l511

しかし、私は何をするのか理解できませんPyUnicode_Check

http://hg.python.org/cpython/file/26af48f65ef3/Objects/unicodeobject.c#l73

4

2 に答える 2

13

エラー メッセージにあるように、環境には文字列のみを含める必要があります。最初の呼び出しはこの条件を満たしていますが、構文で作成された Unicode オブジェクトにPopenマッピングしているため、2 番目の呼び出しは満たしていません。環境ディクテーションを提供するときにバイト文字列のみを使用すると、このエラーは発生しません。PATHu"..."Popen

トレースバックから判断すると、Python 2.6 を使用しているため、リンクされたコードはPython 3.3.0 beta2からのものであるため、実際には適用されないことに注意してください。オブジェクトが Unicode オブジェクトであることを確認します。これは、文字列が(内部的に Unicode オブジェクトとして実装されている) PyUnicode_CheckPython 3 では意味があります。ただし、Python 2.6 では、同等の行が usingであるため、2 番目の例では失敗します。PyString_Check

于 2012-09-03T19:27:24.247 に答える