2

Python でサブプロセスを実行すると、すべてが ASCII パラメータで正常に動作しますが、パラメータが Unicode (キリル文字) 文字列の場合は失敗します。

cmd = [ 'dir.exe', u'по-русски' ]
p = subprocess.Popen([ 'dir.exe', u'по-русски' ])

エラーログ:

Traceback (most recent call last):
  File "process.py", line 48, in <module>
    cyrillic()
  File "process.py", line 45, in cyrillic
    p = subprocess.Popen(cmd, shell=True, stdin=None, stdout=None, stderr=subprocess.PIPE)
  File "C:\Python\27\Lib\subprocess.py", line 679, in __init__
    errread, errwrite)
  File "C:\Python\27\Lib\subprocess.py", line 870, in _execute_child
    args = '{} /c "{}"'.format (comspec, args)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-10: ordinal not in range(128)

私はさまざまな実行可能ファイルを試しました - 7z.ex、ls.exe - それらを実行する前に popen が失敗します。

しかし、ユニコード文字列を特定のエンコーディングにエンコードするとどうなるでしょうか?

# it works because 1251 is kinda native encoding for my Windows
cmd = [ 'dir.exe', CYRILLIC_FILE_NAME.encode('windows-1251') ]

# fails because 1257 cannot be converted to 1251 without errors
cmd = [ 'dir.exe', BALTIC_FILE_NAME.encode('windows-1251') ]

# this may work but it's not a solution because...
cmd = [ 'dir.exe', BALTIC_FILE_NAME.encode('windows-1257') ]

「悪い」ことですが、コンピューターにはさまざまなファイル名があります-バルト語、キリル語など。Windows で非 ASCII ファイル名を Popen に渡す一般的な方法がないように見えますか?! それとも、まだ修正できますか?(できれば汚いハックなしで。​​)

Windows 7、パイソン 2.7.3

4

1 に答える 1

1

Python 3 を使用すると、パラメーターが Unicode として適切に渡されます。サブプロセスがコマンド ラインで Unicode パラメータを読み込めると仮定すると (Python 2 は読み込めません)、動作するはずです。

たとえば、このスクリプトを Python 3 で実行すると、キリル文字が表示されます。

import subprocess
subprocess.call(["powershell", "-c", "echo", "'по-русски'"])
于 2014-01-16T13:24:53.270 に答える