前提・実現したいこと
Vimプラグインのvim-quickrunを使って、Pythonのsubprocessを使ったプログラムを動かしたいです。しかしエラーが出てしまい上手く動きません。何か設定に問題があるのでしょうか。
発生している問題・エラーメッセージ
次のようなエラーメッセージが出て実行できません。
ErrorMessage
1Traceback (most recent call last): 2 File "C:\dev\study\python\subproc.py", line 3, in <module> 3 cp = subprocess.run(['ls', '-l'], capture_output=True) 4 File "C:\Users\terai\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 489, in run 5 with Popen(*popenargs, **kwargs) as process: 6 File "C:\Users\terai\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 804, in __init__ 7 errread, errwrite) = self._get_handles(stdin, stdout, stderr) 8 File "C:\Users\terai\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1142, in _get_handles 9 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) 10OSError: [WinError 6] ハンドルが無効です。
該当のソースコード
Pythonで外部プログラムを動かす方法を勉強しているところです。外部プログラムの標準出力を受け取ってなにか処理をするために、次のようなプログラムを書きました。
python
1import subprocess 2 3cp = subprocess.run(['ls', '-l'], capture_output=True) 4 5# stdoutの中身を使ってなにかする 6print(cp.stdout.decode('utf-8'))
このプログラムをvim-quickrunを使って実行するとエラーが出ました。
vim-quickrunは、次のように設定しています。
VimL
1" _vimrc 2let g:quickrun_config={ 3 \ '_': { 4 \ 'runner': 'job', 5 \ }} 6set runtimepath+=~/vim-quickrun 7filetype plugin indent on 8syntax enable 9
試したこと
次のような手順で実行をしました。
vim -u _vimrc -N subproc.py
でVimを起動する\r
を入力する
もとのPythonのプログラムが間違っているのかな、と思って、コマンドプロンプトの上で
python subproc.py
と実行したところ、こちらはエラーが出ませんでした。
どういう問題が起きているのでしょうか。また、エラーなく動作させるにはなにか設定が足りないのでしょうか。ご教示いただけますと幸いです。
補足情報(FW/ツールのバージョンなど)
- OS: Windows 10 (1909)
- Python: 3.8.2
- Vim: 8.2.694
- vim-quickrun: f637c35
修正依頼への対応
otn 2020/05/04 18:08
切り分けのために、下記でどうなりますか? subprocess.run('ls -l <NUL 2>NUL ', shell=True, capture_output=True)
次のようにプログラムを変え、実行しました。
python
1import subprocess 2 3# cp = subprocess.run(['ls', '-l'], capture_output=True) 4cp = subprocess.run('ls -l <NUL 2>NUL ', shell=True, capture_output=True) 5 6# stdoutの中身を使ってなにかする…… 7print(cp.stdout.decode('utf-8'))
実行結果は次の通りで、同じようなエラーが出るようでした。
ErrorMessage
1Traceback (most recent call last): 2 File "C:\dev\study\python\subproc.py", line 4, in <module> 3 cp = subprocess.run('ls -l <NUL 2>NUL ', shell=True, capture_output=True) 4 File "C:\Users\terai\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 489, in run 5 with Popen(*popenargs, **kwargs) as process: 6 File "C:\Users\terai\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 804, in __init__ 7 errread, errwrite) = self._get_handles(stdin, stdout, stderr) 8 File "C:\Users\terai\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1142, in _get_handles 9 p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) 10OSError: [WinError 6] ハンドルが無効です。
回答1件
あなたの回答
tips
プレビュー