如果您对“类文件对象”感到满意,则上述答案有效,其中StringIO类的对象只是一种特殊情况。然而,StringIO类的实例并不是Python 中使用的严格意义上的“文件对象”(即与内置open函数返回的内容相同的类型)。
例如,StringIO对象没有fileno方法,故意省略了方法:
fileno() 未实现,因此使用它的代码会提前触发异常。
一个可能是严格的“文件对象”而不仅仅是“类文件对象”的原因有几个。如上所说,
使用真实文件通常更快(但不太方便)。
另一个原因是“类文件”对象(如类的对象StringIO)不能用作 of 的参数的参数stdin,这是我在 Google 上找到这个问题时想到的用例。这是因为,在 Python 3.7 的第 1324 行(定义使用的模块)中,该方法尝试定义变量,这显然只有在首先具有方法时才有效。因此,真正的“文件对象”和“类文件对象”(如类的实例)之间的区别不仅仅是毫无意义的迂腐。create_subprocess_execasyncio.subprocesssubprocess.pysubprocessasyncio.subprocess_get_handlesp2cread = stdin.fileno()stdinfilenoStringIO
以下不是一个理想的解决方案,但适用于我的目的:
def string_to_file(string):
file_object = open('temporary_file.temporary', 'w')
file_object.write(string)
file_object.flush()
return file_object
另一方面,它不适用于您的目的,因为它写入磁盘。这可能会起作用:
def string_to_file(string):
import tempfile
file_like_object = tempfile.NamedTemporaryFile()
file_like_object.write(string.encode())
file_like_object.flush()
return file_like_object
两者都适用于传递到create_subprocess_exec.