質問編集履歴

5

更新

2022/01/18 05:53

投稿

akiyama_pga
akiyama_pga

スコア186

test CHANGED
File without changes
test CHANGED
@@ -27,13 +27,14 @@
27
27
  # 自分のためのメモ
28
28
  ```
29
29
  # 指定したプログラム(orファイル)でファイルを開くのが、
30
- # popen()、つまりpopen()は内部でopen(, 'rb')のようなことをしている。
30
+ # popen()、つまりpopen()は内部で新規のopen(, 'rb')のようなことをしている。
31
- # openされたファイルには、渡されたプログラムの標準出力が書き込まれる。
31
+ # openされた新規臨時ファイルには、渡されたプログラムの標準出力が書き込まれる。
32
+ # shファイルなどを渡されても同様それを実行した標準出力を書き込む。
32
- # stdout引数にPIPEが指定されていると、作成されるインス変数stdoutにそのファイルオブが
33
+ # stdout引数にPIPEが指定されていると、作成されるインス変数stdoutにそのファイルオブが
33
34
  # セットされる。
34
35
  p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
35
36
  # バイナリモードの場合は読み込み(openのrb引数)はio.BufferedReaderファイルオブが返る。
36
- print(p1.stdout) # <_io.BufferedReader name=4>
37
+ print(p1.stdout) # <_io.BufferedReader name=4> ※バイナリ指定のファイルオブ
37
38
  # name=4の4は通常にopen()使用した際はファイル名になるので、popenが付けてるファイル名
38
39
  # この数値は被ることがないようになっているようだ。
39
40
  # 当然read()やreadline()などファイルオブが持つメソを使える。(同じオブだから当然)

4

追加4

2022/01/17 07:16

投稿

akiyama_pga
akiyama_pga

スコア186

test CHANGED
File without changes
test CHANGED
@@ -34,6 +34,8 @@
34
34
  p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
35
35
  # バイナリモードの場合は読み込み(openのrb引数)はio.BufferedReaderファイルオブが返る。
36
36
  print(p1.stdout) # <_io.BufferedReader name=4>
37
+ # name=4の4は通常にopen()使用した際はファイル名になるので、popenが付けてるファイル名
38
+ # この数値は被ることがないようになっているようだ。
37
39
  # 当然read()やreadline()などファイルオブが持つメソを使える。(同じオブだから当然)
38
40
  # ただしcommunicateなどはpopen独自のものだから、p1.communicate()のように使う。
39
41
  # ファイルの利用が終われば close(ファイルオブのインスメソ)を使ってファイルオブジェクトを閉じる後処理をする。

3

追加3

2022/01/17 07:04

投稿

akiyama_pga
akiyama_pga

スコア186

test CHANGED
File without changes
test CHANGED
@@ -39,6 +39,9 @@
39
39
  # ファイルの利用が終われば close(ファイルオブのインスメソ)を使ってファイルオブジェクトを閉じる後処理をする。
40
40
  # これをしなければどんなリスクがあるのかは、f.close()しない場合と全く同じこと。
41
41
  p1.stdout.close()
42
+ # close()した後にprint(p1.stdout.read())としても当然ValueError: read of closed file
43
+ # ただし、seek(0)で元に戻して再度read()しようとしてみるとio.UnsupportedOperation: File or
44
+ # stream is not seekable.になった。
42
45
 
43
46
  ```
44
47
 

2

追加2

2022/01/17 06:45

投稿

akiyama_pga
akiyama_pga

スコア186

test CHANGED
File without changes
test CHANGED
@@ -37,6 +37,7 @@
37
37
  # 当然read()やreadline()などファイルオブが持つメソを使える。(同じオブだから当然)
38
38
  # ただしcommunicateなどはpopen独自のものだから、p1.communicate()のように使う。
39
39
  # ファイルの利用が終われば close(ファイルオブのインスメソ)を使ってファイルオブジェクトを閉じる後処理をする。
40
+ # これをしなければどんなリスクがあるのかは、f.close()しない場合と全く同じこと。
40
41
  p1.stdout.close()
41
42
 
42
43
  ```

1

追加

2022/01/17 06:42

投稿

akiyama_pga
akiyama_pga

スコア186

test CHANGED
File without changes
test CHANGED
@@ -23,3 +23,23 @@
23
23
 
24
24
 
25
25
 
26
+
27
+ # 自分のためのメモ
28
+ ```
29
+ # 指定したプログラム(orファイル)でファイルを開くのが、
30
+ # popen()、つまりpopen()は内部でopen(, 'rb')のようなことをしている。
31
+ # openされたファイルには、渡されたプログラムの標準出力が書き込まれる。
32
+ # stdout引数にPIPEが指定されていると、作成されるインス変数stdoutにそのファイルオブが
33
+ # セットされる。
34
+ p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
35
+ # バイナリモードの場合は読み込み(openのrb引数)はio.BufferedReaderファイルオブが返る。
36
+ print(p1.stdout) # <_io.BufferedReader name=4>
37
+ # 当然read()やreadline()などファイルオブが持つメソを使える。(同じオブだから当然)
38
+ # ただしcommunicateなどはpopen独自のものだから、p1.communicate()のように使う。
39
+ # ファイルの利用が終われば close(ファイルオブのインスメソ)を使ってファイルオブジェクトを閉じる後処理をする。
40
+ p1.stdout.close()
41
+
42
+ ```
43
+
44
+
45
+