我想调用一个脚本,将字符串的内容传递给它的stdin并检索它的标准输出.
我不想触摸真正的文件系统,所以我无法为它创建真正的临时文件.
使用subprocess.check_output我可以得到脚本写的任何内容; 我怎样才能将输入字符串输入到stdin中?
subprocess.check_output([script_name,"-"],stdin="this is some input")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 537, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
File "/usr/lib/python2.7/subprocess.py", line 1043, in _get_handles
p2cread = stdin.fileno()
AttributeError: 'str' object has no attribute 'fileno'
Run Code Online (Sandbox Code Playgroud) def captureOutput(self, func, *args, **kwargs):
pass
sys.stdout.flush()
sys.stderr.flush()
(outfd, fn) = tempfile.mkstemp()
fout = os.fdopen(outfd, 'r')
os.unlink(fn)
(errfd, fn) = tempfile.mkstemp()
ferr = os.fdopen(errfd, 'r')
os.unlink(fn)
try:
oldstdout = os.dup(sys.stdout.fileno())
oldstderr = os.dup(sys.stderr.fileno())
os.dup2(outfd, sys.stdout.fileno())
os.dup2(errfd, sys.stderr.fileno())
try:
ret = func(*args, **kwargs)
finally:
sys.stderr.flush()
sys.stdout.flush()
os.dup2(oldstdout, sys.stdout.fileno())
os.close(oldstdout)
os.dup2(oldstderr, sys.stderr.fileno())
os.close(oldstderr)
os.lseek(outfd, 0, 0)
out = fout.read()
os.lseek(errfd, 0, 0)
err = ferr.read()
finally:
fout.close()
ferr.close()
return ret, out, err
Run Code Online (Sandbox Code Playgroud)
运行此代码时,出现错误:
AttributeError: StringIO instance has no attribute 'fileno'
为什么我会收到此错误,如何更正错误?
我想使用运行命令subprocess.run(),然后将其 stdout/stderr 作为字符串获取,但我希望子进程在运行时也能正常将其输出打印到控制台。如果我做
result = subprocess.run(['ls', '-al'])
Run Code Online (Sandbox Code Playgroud)
然后我可以看到打印到控制台的输出,但在命令运行后我无法访问输出。如果我做
result = subprocess.run(['ls', '-al'], capture_output=True, text=True)
Run Code Online (Sandbox Code Playgroud)
我可以访问result.stdout,result.stderr但在命令运行时控制台上没有打印任何内容。我可以同时打印到控制台并保存到吗result.stdout?