

gccのエラーメッセージを行ごとのリストに格納するにはどうすれば良いのでしょうか？  
gccコマンドの対象ファイルはコマンドライン引数から用いたいです。

[code]

    #coding:UTF-8
    
    import subprocess
    import sys
    args = sys.argv
    lines = []
    
    proc=subprocess.Popen(['gcc','Wall','Wextra',args[1]+'.c'].splitlines(),stderr=subprocess.PIPE)
    
    lines = proc.stderr
    print(lines)
    
[/code]

上記のコードを実行すると以下のようなエラーが発生してしまいます

[code]

    Traceback (most recent call last):
      File "test.py", line 8, in <module>
    proc=subprocess.Popen(['gcc','Wall','Wextra',args[1]+'.c'].splitlines(),stderr=subprocess.PIPE)
    AttributeError: 'list' object has no attribute 'splitlines' 
    
[/code]

例えば以下のようなエラーが発生した場合

[code]

    undec.c: In function 'main':
    undec.c:8:2: error: 'z' undeclared (first use in this function)
      z=30;
      ^
    undec.c:8:2: note: each undeclared identifier is reported only once for each function it appears in
    
    
[/code]

次のようにリストに格納したいです．。

[code]

    lines=["undec.c: In function 'main':\n","undec.c:8:2: error: 'z' undeclared (first use in this function)/n","z=30;\n","^\n","undec.c:8:2: note: each undeclared identifier is reported only once for each function it appears in\n"]
    
[/code]


CC BY-SA 4.0
2020-01-19T15:25:04.387
62363
2020-01-19T17:06:33.877
2020-01-19T16:24:22.840
3060
37132
question
python python3 gcc
python内でgccのエラーメッセージのリスト化


  1. Popenではなくrunを使ってください。
  2. gccへの引数にハイフンが足りません。
  3. proc.stderrはバイナリ文字列になりますから適宜デコードが必要です。

[code]

    import subprocess
    import sys
    args = sys.argv
    lines = []
    
    proc=subprocess.run(['gcc','-Wall','-Wextra',args[1]+'.c'],stderr=subprocess.PIPE)
    
    lines = proc.stderr.decode('utf-8').splitlines(keepends=True)
    print(lines)
    
[/code]


CC BY-SA 4.0
2020-01-19T15:56:26.697
62364
2020-01-19T15:56:26.697
62
62363
answer


`subprocess.Popen()` を使う場合、with 文(context manager)で以下の様に書くこともできます。

[code]

    import subprocess
    import sys
    
    if len(sys.argv) < 2:
      print("None arguments.", file=sys.stderr)
      sys.exit(1)
    
    args = sys.argv
    with subprocess.Popen([
      'gcc', '-Wall', '-Wextra', args[1] + '.c'
    ], stderr=subprocess.PIPE, encoding='utf-8') as proc:
      lines = proc.stderr.readlines()
    
    print(lines)
    
[/code]


CC BY-SA 4.0
2020-01-19T17:06:33.877
62366
2020-01-19T17:06:33.877
62363
answer