Windows上的Python:path as subprocess参数被修改并生成错误
我在Windows和Python2.6上使用子进程,如下所示。我正在尝试使用遗留解析器应用程序(假定parser.py)解析文本文件,如下所示:Windows上的Python:path as subprocess参数被修改并生成错误,python,subprocess,Python,Subprocess,我在Windows和Python2.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
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运行_parser.py来获取输出。我会感激任何比这更好的东西
谢谢您的时间。“C:\Report1\2011-03-14.txt”
与路径C:\Report1\2011-03-14.txt
不同。它实际上是一个bytestring,'C:\\Report1\x811-03-14.txt'
。奇怪的是,听起来这不是你的问题,但它可能是相关的<代码>r“C:\Report1\2011-03-14.txt”修复了此问题
但是请注意,打印表示中的双反斜杠并不一定意味着实际上有两个反斜杠<代码>'\'是长度为1的Python字符串。更改参数列表,将路径编码为原始字符串:
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)
>k=subprocess.Popen(['python','test2.py','w:\bin\test2.py'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.stdout)
>>>k.交流()
5:(“回溯(最近一次调用):\r\n文件“w:\\bin\\test2.py”,第4行,在
data=open(userinput,\'rb\')。read()
IOError:[Errno 22]无效模式(\'rb\')或文件名:“w:\\x08in\\test2.py',无)
>>>k=subprocess.Popen(['python',r'w:\bin\test2.py',r'w:\bin\test2.py'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.stdout)
>>>k.交流()
6:('test2.py datasize=194\n',无)
“C:\Report1\2011-03-14.txt”与路径C:\Report1\2011-03-14.txt不同。它实际上是一个bytestring,“C:\Report1\x811-03-14.txt”。奇怪的是,听起来这不是你的问题,但它可能是相关的。r“C:\Report1\2011-03-14.txt”解决了这个问题
但请注意,打印表示中的双反斜杠并不一定意味着实际上有两个反斜杠是长度为1的Python字符串
您是否尝试过:
from subprocess import Popen, PIPE
k = Popen(r'python parser.py -f "C:\Report1\2011-03-14.txt"',
shell=True,
stdout=PIPE,
stderr=STDOUT)
print k.communicate()
我发现,通常在通过Popen在命令行上传递参数时,将参数括在双引号中是使其正常工作的唯一可靠方法。我也不总是相信调用Popen的list方法,通常自己生成命令。请注意原始指示符(r“”)。您有权访问parser.py吗?你能发布任何相关部分吗?parser.py是一个大应用程序。它失败的相关内容是当它尝试读取文件输入作为参数-f.k=subprocess.Popen(['python','parser.py','-f','C:\Report1\2011-03-14.txt',shell=True,stdout=subprocess.PIPE,stderr=subprocess.stdout)来尝试一下。感谢Nate和Uku。不幸的是,它不起作用。收到相同的错误。您确定逐字粘贴了它吗?这是“然后”。@martineau谢谢你的编辑。我应该学会在睡眠不足时不回答问题。:)