VSCode 확장 내에서 Python 실행

TL;DR



Node.js python-shell 패키지를 사용하면 VSCode 확장 내에서 Python을 호출 할 수 있습니다.

만든 것



VSCode의 확장 기능은 TypeScript로 개발했지만 JavaScript와 TypeScript에 익숙하지 않기 때문에 Python으로 작성하고 싶었습니다. 조사하면python-shell 라는 Node.js 의 패키지가 있어, 이것을 사용하면 할 수 있는 것은? , 라고 생각해 보았습니다.

움직이면 다음과 같은 느낌입니다. 보이지 않지만 오른쪽 하단의 메시지는 Python에서 나온 것입니다.


수행한 절차



Your First Extension 만들기



VSCode 확장 기능의 개발 환경을 만드는 것은 원래 VSCode를 사용하고 있으면 매우 간단합니다. 아래의 기사를 따라가면 곧바로 디버그 환경이 정돈됩니다.

python-shell 추가


npm install python-shell

에서 python-shell을 추가합니다. 기타 변경 사항은 다음과 같습니다.
  • pn11/vscode-extension-with-python/compare/Your-First-Extension...For-Qiita
  • README.md 등은 무시하고 Your First Extension을 바탕으로 자신의 손으로 변경한 것은 python/hello.pysrc/extension.ts뿐입니다.

    파이썬 측면


    python/hello.py 이 확장 프로그램에서 호출하는 스크립트로, 이번에는 첫 번째 인수만 인쇄합니다. Python2 또는 Python3에서도 작동합니다.

    hello.py
    from __future__ import print_function
    import sys
    print(sys.argv[1])
    

    TypeScript 측



    호출자의 src/extension.ts이지만 먼저 L. 4에서 python-shell를 가져옵니다.

    extension.ts
    import { Options, PythonShell } from 'python-shell';
    

    L.24 - L.30에 설치된 확장 프로그램에 대한 경로와 Python 인터프리터에 대한 경로를 가져옵니다.

    extension.ts
    // ログ出力などは省略
    
    let ext_path = vscode.extensions.getExtension('undefined_publisher.vscode-extension-with-python')?.extensionPath;
    
    let pythonpath = vscode.workspace.getConfiguration('python').get<string>('pythonPath');
    

    확장명'undefined_publisher.vscode-extension-with-python'은 만든 확장 기능에 따라 달라집니다. vscode.workspace.getConfiguration('python').get<string>('pythonPath')는 VSCode의 현재 작업 공간에서 선택한 인터프리터입니다.

    L.31 - L.49는 Python 스크립트를 만들지 않고 Python 문을 그대로 실행하는 예제입니다.

    L.51 - L.69가 python/hello.py를 호출하는 곳입니다.

    extension.ts
    // ログ出力などは省略
    
            let options2: Options = {
                mode: 'text',
                pythonPath: pythonpath,
                pythonOptions: ['-u'],
                scriptPath: ext_path,
                args: ['Hello world from Python']
            };
    
            PythonShell.run('python/hello.py', options2, function (err, res) {
                if (err) {
                    console.log(err);
                    throw err;
                }
                const res_str: string = (res || [''])[0];
                vscode.window.showInformationMessage(res_str);
            });
    

    먼저 python-shell에 전달할 Options 객체를 만들고 pythonPath, scriptPath, args 등을 설정합니다. 옵션에 대한 자세한 내용은 공식 정보을 참조하십시오.scriptPath는 실행할 스크립트가 있는 path입니다. 실행하려는 스크립트는拡張機能のインストール場所/python/hello.py에 있으므로 scriptPath 를 확장 프로그램 설치 위치로 설정합니다.
    PythonShell.run('python/hello.py', options2, function (err, res)의 부분에서 실행하는 스크립트와 옵션을 지정해 실행하고 있습니다.
    런타임에 오류가 발생하면 if (err) {}가 실행됩니다. 정상적으로 실행되면res에 표준 출력이 개행으로 단락지어진 리스트로 들어 있기 때문에 1, 1 번째의 요소를 취득해 VSCode 내에 표시하고 있는 것이 vscode.window.showInformationMessage(res_str); 부분 입니다.

    결론



    VSCode 확장에서 Python을 호출하는 방법을 소개했습니다. 필자처럼 TypeScript는 모르겠지만, Python이라면 쓸 수 있다는 사람에게는 편리한 것이 아닐까 생각합니다 2. 본 기사의 TypeScript 는 분위기로 쓰고 있으므로, 쓰는 방법이 이상한 등 있으면 지적해 주세요.

    추가



    위의 방법으로 Evernote 노트를 검색하는 확장 기능을 만들었습니다.

    더 추가



    위의 확장은 결국 Python을 사용하지 않도록 다시 작성되었습니다.




    옵션 modejson 또는 binary로 설정하면 변경됩니다. 

    물론, 에디터와 교환하려면 VSCode API를 사용하기 때문에 TypeScript로 작성해야 합니다. 

    좋은 웹페이지 즐겨찾기