上記の答えは、「ファイルのようなオブジェクト」に満足している場合に機能します。そのStringIO
クラスのオブジェクトは特別なケースにすぎません。ただし、StringIO
クラスのインスタンスは、Python で使用される厳密な意味での「ファイル オブジェクト」ではありませんopen
(つまり、組み込み関数によって返されるものと同じ型)。
たとえば、StringIO
オブジェクトにはメソッドがなくfileno
、意図的にメソッドが省略されています。
fileno() は実装されていないため、それを使用するコードは早期に例外をトリガーします。
「ファイルのようなオブジェクト」だけでなく、厳密な「ファイル オブジェクト」である理由はいくつかあります。上記のように、
多くの場合、実際のファイルを使用する方が高速です (ただし、不便です)。
もう 1 つの理由は、「ファイルのような」オブジェクト (StringIO
クラスのオブジェクトなど) を of の引数の引数として使用できないことです。これは、Google でこの質問を見つけたときに念頭に置いていた使用例です。これは、Python 3.7 の(defining the module, which uses) の 1324 行目で、メソッドが variable を定義しようとするためです。これは明らかに、最初にメソッドがある場合にのみ機能します。したがって、真の「ファイル オブジェクト」と「ファイルのようなオブジェクト」(クラスのインスタンスなど) の区別は、無意味な衒学ではありません。stdin
create_subprocess_exec
asyncio.subprocess
subprocess.py
subprocess
asyncio.subprocess
_get_handles
p2cread = stdin.fileno()
stdin
fileno
StringIO
以下は理想的な解決策を意図したものではありませんが、私の目的には役立ちました。
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
ます。