如何在Python 2上使用带有unicode命令的psutil.Popen

Drx*_*xxd 8 python windows subprocess python-2.x psutil

嘿我正在尝试执行以下命令(使用psutil.Popen和python 2.7):

"C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" "C:\docs\?.xlsm"
Run Code Online (Sandbox Code Playgroud)

使用此代码:

dir = u"C:\\docs"
doc = os.listdir(dir)[0]
full_path = os.path.join(dir, doc)
command = u"\"C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\EXCEL.EXE\" \"{}\"".format(full_path)
process = psutil.Popen(command)
Run Code Online (Sandbox Code Playgroud)

但我得到了这个例外:

    process = psutil.Popen(command)
  File "C:\Python27\lib\site-packages\psutil\__init__.py", line 1370, in __init__
    self.__subproc = subprocess.Popen(*args, **kwargs)
  File "C:\Python27\lib\subprocess.py", line 390, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 640, in _execute_child
    startupinfo)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u05ea' in position 102: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我找到了这个相关的问题: subprocess.Popen有一个unicode路径.但是每一个给出的答案都不适用于我.

使用subprocess.Popen(command.encode(locale.getpreferredencoding()))会抛出以下异常:

Traceback (most recent call last):
  File "scanner_watcher.py", line 53, in _execute
    self.scanner.execute(path)
  File "scanner_watcher.py", line 356, in execute
    self._execute(file_path)
  File "scanner_watcher.py", line 201, in _execute
    self.open_scanner(file_path, file_package)
  File "scanner_watcher.py", line 287, in open_scanner
    self.scanner_process = psutil.Popen(command.encode(locale.getpreferredencoding()))
  File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u05ea' in position 102: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

使用path.encode('mbcs')将所有Unicode字符转换为问号.

我不想使用os.startfile,因为我需要在程序上使用不同的命令,然后处理打开的进程(当os.startfile不允许时).

我发现这个修改过的Popen:https://gist.github.com/vaab/2ad7051fc193167f15f85ef573e54eb9 但是这段代码没有经过彻底的测试.

在python 2.7中使用带有Unicode命令的Popen是否有正确的方法?

谢谢.

jsh*_*p29 0

问题是您在定义时使用双引号command。它的编写方式在所有错误的位置将语句分割成多个字符串。用单引号替换第一个和最后一个引号(字符串的开始和结束)解决了我的问题。

command = u'\"C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\EXCEL.EXE\" \"{}\"'.format(full_path)