我在 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()
Run Code Online (Sandbox Code Playgroud)
这里的问题在于文件名传递到旧应用程序的方式,我无法更改代码,只能使用 Python 访问它。
它生成并出现以下错误:
IOError: [Errno 22] invalid mode (\'r\') or filename: C:\\Report1\\2011-03-14.txt
Run Code Online (Sandbox Code Playgroud)
当我从回溯中复制修改后的文件名(带有双正斜杠)来检查是否存在时,系统无法找到它。
问题:如何将路径作为参数传递,以便在不更改为双斜杠的情况下对其进行处理,以便系统可以读取文件?
注意:os.sep 也不能解决该问题。
编辑:使用 os.system 执行效果很好,但问题是获取输出以供以后使用。目前我在一个模块(run_parser.py)中使用 os.sytem,然后在另一个模块(get_parse_status.py)中使用子进程,该子进程打开 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)
Run Code Online (Sandbox Code Playgroud)
一个读取文件并报告长度的简单程序:
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)
Run Code Online (Sandbox Code Playgroud)
然后通过解释器调用它:
>>> 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7349 次 |
| 最近记录: |