How to write a batch file showing path to executable and version of Python handling Python scripts on Windows?

后端 未结 2 758
刺人心
刺人心 2020-12-18 16:15

It should display path to executable and version of Python for scripts run with direct invocation of Python (python myscript.py) as well as for scripts run dire

相关标签:
2条回答
  • 2020-12-18 16:46

    Here's my first solution:

    SOLUTION 1

    @echo off
    set test_script=.pyexe.py
    rem Let's create temporary Python script which prints info we need
    echo from __future__ import print_function; import sys; print(sys.executable); print(sys.version) > %test_script%
    echo Python accessible through system PATH:
    python %test_script%
    echo ---
    echo Python set as handler for Python files:
    %test_script%
    del %test_script%
    set test_script=
    

    I run into problem with this, however. When there's no valid Python interpreter associated with Python files trying to open Python file with some_script.py pops up Open With system dialog. Solving this problem requires very good knowledge of batch files. Therefore trying to come up with a solution I've asked the following questions:

    • How to prevent “Open With” dialog window when opening file from command window?
    • How to escape variables with parentheses inside if-clause in a batch file?
    • Why is delayed expansion in a batch file not working in this case?
    • How to split double quoted strings with embedded spaces deliminated with spaces in a batch file?

    Improved version of the original batch file looks now like this:

    SOLUTION 1b

    @echo off
    setlocal
    set test_script=.pyexe.py
    rem Let's create temporary Python script which prints info we need
    echo from __future__ import print_function; import sys; print(sys.executable); print(sys.version) > %test_script%
    echo Python accessible through the system PATH:
    python %test_script%
    echo ---
    echo Python set as a handler for Python files:
    rem We need to check if a handler set in the registry exists to prevent "Open With"
    rem dialog box in case it doesn't exist
    rem ftype Python.File hypothetical return value:
    rem Python.File="%PYTHON_HOME%\python.exe" "%1" %*
    for /f "tokens=2 delims==" %%i in ('ftype Python.File') do set reg_entry=%%i
    rem ...now in 'reg_entry' variable we have everything after equal sign:
    rem "%PYTHON_HOME%\python.exe" "%1" %*
    set "handler="
    setlocal enableDelayedExpansion
    for %%A in (!reg_entry!) do if not defined handler endlocal & set handler=%%A
    rem ...now in 'handler' variable we have the first token:
    rem "%PYTHON_HOME%\python.exe"
    rem Now we expand any environment variables that might be present
    rem in the handler's path
    for /f "delims=" %%i in ('echo %handler%') do set expanded_handler=%%i
    if exist "!expanded_handler!" (
        "%test_script%"
    ) else (
      if not "!handler!" == "!expanded_handler!" (
        set "handler=!expanded_handler! ^(!handler!^)"
      )
      echo Handler is set to !handler! which does not exist
    )
    del %test_script%
    

    This is another take avoiding problems of the above two:

    SOLUTION 2

    @echo off
    setlocal
    echo Python accessible through the system PATH:
    where python
    echo ---
    echo Python set as a handler for Python source files (.py):
    for /f "skip=2 tokens=1,2*" %%i in ('reg query HKCR\.py /ve') do set "file_type=%%k"
    for /f "skip=2 tokens=1,2*" %%i in ('reg query HKCR\%file_type%\shell\open\command /ve') do echo %%k
    

    ... and improved version:

    SOLUTION 2b

    @echo off
    setlocal EnableDelayedExpansion
    echo Python interpreter accessible through the system PATH:
    where python
    if not errorlevel 1 (
        python -c "from __future__ import print_function; import sys; print(sys.version)"
    )
    echo ---
    echo Python interpreter registered as a handler for Python source files (.py):
    reg query HKCR\.py /ve >nul 2>&1
    if errorlevel 1 (
        echo No "HKEY_CLASSES_ROOT\.py" registry key found
    ) else (
        for /f "skip=2 tokens=1,2*" %%i in ('reg query HKCR\.py /ve 2^>nul') do set "file_type=%%k"
        if "!file_type!"=="(value not set)" (
            echo "No file type set for .py extension"
        ) else (
            reg query HKCR\!file_type!\shell\open\command /ve >nul 2>&1
            if errorlevel 1 (
                echo No "HKEY_CLASSES_ROOT\!file_type!\shell\open\command" registry key found
            ) else (
                for /f "skip=2 tokens=1,2*" %%i in ('reg query HKCR\!file_type!\shell\open\command /ve 2^>nul') do set "handler=%%k"
                if "!handler!"=="(value not set)" (
                    echo No command set for !file_type!
                ) else (
                    echo !handler!
                )
            )
        )
    )
    
    0 讨论(0)
  • 2020-12-18 17:07

    This might be what you're looking for:

    python -c "import sys; print sys.executable"
    
    0 讨论(0)
提交回复
热议问题