Windows 上的 Python : path as subprocess argument gets modified and generating error

标签 python subprocess

我在 Windows 和 Python 2.6 上使用子进程如下。我正在尝试使用遗留解析器应用程序(假设为 parser.py)解析文本文件,如下所示:

import subprocess
k = subprocess.Popen(['python', 'parser.py', '-f C:\Report1\2011-03-14.txt'],
                     shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print k.communicate()

这里的问题是文件名传递给遗留应用程序的方式,我无法更改代码但只能使用 Python 访问它。

它生成以下错误:

IOError: [Errno 22] invalid mode (\'r\') or filename: C:\\Report1\\2011-03-14.txt

当我从回溯中复制修改后的文件名(带有双正斜杠)以检查是否存在时,系统无法找到它。

问题:如何将路径作为参数传递,以便在不更改为双斜杠的情况下对其进行处理,以便系统可以读取文件?

注意:os.sep 也不能解决问题。

编辑:使用 os.system 执行完美无缺,但问题在于获取输出以备后用。我目前在模块 (run_parser.py) 中使用 os.sytem,然后在另一个模块 (get_parse_status.py) 中使用子进程,该模块 Popens run_parser.py 来获取输出。会感激任何比这更好的东西。

感谢抽空。

最佳答案

更改参数列表以将路径编码为原始字符串:

k = subprocess.Popen(['python', 'parser.py', '-f', r'C:\Report1\2011-03-14.txt'],
                     shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

读取文件并报告长度的简单程序:

import sys
import os
userinput = sys.argv[1]
data = open(userinput, 'rb').read()
datalength = len(data)
fname = os.path.basename(userinput)
print "%s datasize = %s" % (fname, datalength)

然后通过解释器调用它:

>>> k = subprocess.Popen(['python', 'test2.py', 'w:\bin\test2.py'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>>> k.communicate()
5: ('Traceback (most recent call last):\r\n  File "w:\\bin\\test2.py", line 4, in <module>
data = open(userinput, \'rb\').read()
IOError: [Errno 22] invalid mode (\'rb\') or filename: 'w:\\x08in\\test2.py', None)
>>> k = subprocess.Popen(['python', r'w:\bin\test2.py', r'w:\bin\test2.py'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
>>> k.communicate()
6: ('test2.py datasize = 194\n', None)

关于Windows 上的 Python : path as subprocess argument gets modified and generating error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5302995/

相关文章:

python - 在 Python 中迭代/枚举 N^5 的子集

python - 如何使用 python 和 GPIB 接口(interface)访问安捷伦设备(借助 NI GPIB 到 USB 转换器)?

python - 在 Python 中更改键盘锁

python - 删除 tkinter 文本默认绑定(bind)

python - 如何将此命令传递给 subprocess.call?

python - 输出子进程调用的命令行?

python - 从 Linux 终端执行包含子进程的 PyQt5 GUI 会导致 GUI 出现黑屏并卡住

python - AWS SNS 记录是否始终是单个元素列表?

python - 子流程中的变量

python-3.x - 如何获取用户的桌面位置