相关疑难解决方法(0)

将数据传递给subprocess.check_output

我想调用一个脚本,将字符串的内容传递给它的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)

python

31
推荐指数
3
解决办法
1万
查看次数

AttributeError:StringIO实例没有属性'fileno'

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'

为什么我会收到此错误,如何更正错误?

python

18
推荐指数
2
解决办法
2万
查看次数

捕获 subprocess.run() 的输出并实时打印它?

我想使用运行命令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.stdoutresult.stderr但在命令运行时控制台上没有打印任何内容。我可以同时打印到控制台并保存到吗result.stdout

python subprocess

16
推荐指数
1
解决办法
2万
查看次数

标签 统计

python ×3

subprocess ×1