如何在 Python 2 上使用 psutil.Popen 和 unicode 命令

Posted

技术标签:

【中文标题】如何在 Python 2 上使用 psutil.Popen 和 unicode 命令【英文标题】:How to use psutil.Popen with unicode commands on Python 2 【发布时间】:2018-02-15 05:38:52 【问题描述】:

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

"C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" "C:\docs\ת.xlsm"

使用此代码:

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)

但我遇到了这个异常:

    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)

我发现了这个相关的问题: subprocess.Popen with a unicode path。但是那里的每个给定答案都不适合我。

使用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>

使用 path.encode('mbcs') 将所有 Unicode 字符变成问号。

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

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

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

谢谢。

【问题讨论】:

请显示代码,以便我们准确了解此命令的格式以及您尝试执行它的具体操作。 @user2357112 添加了代码 您的选择是使用 ctypes、cffi 或扩展模块通过 Unicode 命令行调用 CreateProcessW 您也可以使用 C 运行时的 _wsystem 函数。例如:import ctypes;msvcr90 = ctypes.CDLL('msvcr90', use_errno=True);wsystem = msvcr90._wsystem;wsystem.argtypes = (ctypes.c_wchar_p,)。然后拨打wsystem(u'"%s"' % command)。额外的双引号会被 CMD 的“旧行为”去掉,您可以通过 cmd /? 阅读规则。 @eryksun 这很有趣.. 但我想使用 Popen 最终使用管道选项,例如获取输出等。 【参考方案1】:

问题在于您在定义command 时使用了双引号。它的编写方式在所有错误的地方将语句拆分为多个字符串。用单引号代替第一个和最后一个引号(字符串的打开和关闭)解决了我的问题。

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

【讨论】:

以上是关于如何在 Python 2 上使用 psutil.Popen 和 unicode 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 2.7 在 Windows 上修复 pip 安装证书问题? [复制]

如何在一台电脑上同时使用 Python 2 和 Python 3

如何使用 Python 2.6 在 Windows 上安装 PyGTK / PyGobject?

如何在Windows上使用Python 3.3.2直接打印到打印机?

如何在 python 2.7 上安装 python pip

如何在 Windows 上静默卸载 Python 2.7?