98

I have a simple script blah.py (using Python 2):

import sys print sys.argv[1] 

If I execute my script by:

python c:/..../blah.py argument 

It prints argument but if I execute script by:

blah.py argument 

error occurs:

IndexError...

So arguments do not pass to script.

python.exe in PATH. Folder with blah.py also in PATH.
python.exe is default program to execute *.py files.

What is the problem?

4
  • 3
    posting a snippet of code might help us help you.
    – jldupont
    CommentedDec 20, 2009 at 2:15
  • Man without crystall ball has already gave a solution=) print sys.argv[1] produces this error.
    – ton4eg
    CommentedDec 20, 2009 at 3:19
  • If you have multiple versions of Python installed, you may need this stackoverflow.com/questions/1934675/….
    – laike9m
    CommentedMar 16, 2014 at 16:15
  • Manually tell python to run my script from registry: "C:\Python27\python.exe" "C:\Python27\tpt.py" "%1"`
    – user285594
    CommentedFeb 22, 2016 at 11:01

9 Answers 9

149

When you execute a script without typing "python" in front, you need to know two things about how Windows invokes the program. First is to find out what kind of file Windows thinks it is:

 C:\>assoc .py .py=Python.File 

Next, you need to know how Windows is executing things with that extension. It's associated with the file type "Python.File", so this command shows what it will be doing:

 C:\>ftype Python.File Python.File="c:\python26\python.exe" "%1" %* 

So on my machine, when I type "blah.py foo", it will execute this exact command, with no difference in results than if I had typed the full thing myself:

 "c:\python26\python.exe" "blah.py" foo 

If you type the same thing, including the quotation marks, then you'll get results identical to when you just type "blah.py foo". Now you're in a position to figure out the rest of your problem for yourself.

(Or post more helpful information in your question, like actual cut-and-paste copies of what you see in the console. Note that people who do that type of thing get their questions voted up, and they get reputation points, and more people are likely to help them with good answers.)

Brought In From Comments:

Even if assoc and ftype display the correct information, it may happen that the arguments are stripped off. What may help in that case is directly fixing the relevant registry keys for Python. Set the

HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command 

key to:

"C:\Python26\python26.exe" "%1" %* 

Likely, previously, %* was missing. Similarly, set

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command 

to the same value. See http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

example registry setting for python.exeHKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command The registry path may vary, use python26.exe or python.exe or whichever is already in the registry.

enter image description hereHKEY_CLASSES_ROOT\py_auto_file\shell\open\command

5
  • 30
    Even if assoc and ftype display the correct information, it may happen that the arguments are stripped off. What may help in that case is directly fixing the relevant registry keys for Python. Set the HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command key to: "C:\Python26\python26.exe" "%1" %* Likely, previously, %* was missing. Similarly, set HKEY_CLASSES_ROOT\py_auto_file\shell\open\command to the same value. See eli.thegreenplace.net/2010/12/14/…
    – parvus
    CommentedOct 15, 2012 at 9:57
  • 5
    @parvus Your comment was the ultimate solution for me. Even with the associations reading correctly, these two keys were both incorrectly set.CommentedJul 17, 2013 at 23:09
  • 1
    I've also run into problems with HKEY_CLASSES_ROOT\.py\OpenWithProgids being set to something VisualStudio related, specifically when I try to run Python scripts in my AppVeyor tests. See help.appveyor.com/discussions/problems/….CommentedDec 21, 2015 at 20:07
  • 1
    I have similar issue. Anaconda by default added registry key with missing %*
    – prasad
    CommentedJun 2, 2016 at 22:21
  • In Win10 I write test.py 123 and I get 123 printed as sys.argv[1]. Did Microsoft changed something?
    – Hrvoje T
    CommentedMar 28, 2018 at 6:39
24

you should make the default application to handle python files be python.exe.

right click a *.py file, select "Open With" dialog. In there select "python.exe" and check "always use this program for this file type" (something like that).

then your python files will always be run using python.exe

1
  • For me, VScode open instead for what ever reason. This fixed the running of a py file for me.
    – DingoCC
    CommentedApr 15 at 23:37
16

Additionally, if you want to be able to run your python scripts without typing the .py (or .pyw) on the end of the file name, you need to add .PY (or .PY;.PYW) to the list of extensions in the PATHEXT environment variable.

In Windows 7:

right-click on Computer
left-click Properties
left-click Advanced system settings
left-click the Advanced tab
left-click Environment Variables...
under "system variables" scroll down until you see PATHEXT
left-click on PATHEXT to highlight it
left-click Edit...
Edit "Variable value" so that it contains ;.PY(the End key will skip to the end)
left-click OK
left-click OK
left-click OK

Note #1: command-prompt windows won't see the change w/o being closed and reopened.

Note #2: the difference between the .py and .pyw extensions is that the former opens a command prompt when run, and the latter doesn't.

On my computer, I added ;.PY;.PYW as the last (lowest-priority) extensions, so the "before" and "after" values of PATHEXT were:

before: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

after .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

Here are some instructive commands:

C:\>echo %pathext% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW C:\>assoc .py .py=Python.File C:\>ftype Python.File Python.File="C:\Python32\python.exe" "%1" %* C:\>assoc .pyw .pyw=Python.NoConFile C:\>ftype Python.NoConFile Python.NoConFile="C:\Python32\pythonw.exe" "%1" %* C:\>type c:\windows\helloworld.py print("Hello, world!") # always use a comma for direct address C:\>helloworld Hello, world! C:\> 
    4

    How to execute Python scripts in Windows?

    You could install pylauncher. It is used to launch .py, .pyw, .pyc, .pyo files and supports multiple Python installations:

    T\:> blah.py argument 

    You can run your Python script without specifying .py extension if you have .py, .pyw in PATHEXT environment variable:

    T:\> blah argument 

    It adds support for shebang (#! header line) to select desired Python version on Windows if you have multiple versions installed. You could use *nix-compatible syntax #! /usr/bin/env python.

    You can specify version explicitly e.g., to run using the latest installed Python 3 version:

    T:\> py -3 blah.py argument 

    It should also fix your sys.argv issue as a side-effect.

    3
    4

    I encountered the same problem but in the context of needing to package my code for Windows users (coming from Linux). My package contains a number of scripts with command line options.

    I need these scripts to get installed in the appropriate location on Windows users' machines so that they can invoke them from the command line. As the package is supposedly user-friendly, asking my users to change their registry to run these scripts would be impossible.

    I came across a solution that the folks at Continuum use for Python scripts that come with their Anaconda package -- check out your Anaconda/Scripts directory for examples.

    For a Python script test, create two files: a test.bat and a test-script.py.

    test.bat looks as follows (the .bat files in Anaconda\Scripts call python.exe with a relative path which I adapted for my purposes):

    @echo off set PYFILE=%~f0 set PYFILE=%PYFILE:~0,-4%-script.py "python.exe" "%PYFILE%" %* 

    test-script.py is your actual Python script:

    import sys print sys.argv 

    If you leave these two files in your local directory you can invoke your Python script through the .bat file by doing

    test.bat hello world ['C:\\...\\test-scripy.py', 'hello', 'world'] 

    If you copy both files to a location that is on your PATH (such as Anaconda\Scripts) then you can even invoke your script by leaving out the .bat suffix

    test hello world ['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world'] 

    Disclaimer: I have no idea what's going on and how this works and so would appreciate any explanation.

    1
    • 1
      Creating a .bat wrapper for each Python script is clumsy and redundant. I would not recommend this.
      – tripleee
      CommentedDec 31, 2017 at 21:10
    2

    On Windows,

    To run a python module without typing "python",

    --> Right click any python(*.py) file

    --> Set the open with property to "python.exe"

    --> Check the "always use this program for this file type"

    --> Append the path of python.exe to variable environment e.g. append C:\Python27 to PATH environment variable.

    To Run a python module without typing ".py" extension

    --> Edit PATHEXT system variable and append ".PY" extension to the list.

      1

      Can you execute python.exe from any map? If you do not, chek if you have proper values for python.exe in PATH enviroment

      Are you in same directory than blah.py. Check this by issuing command -> edit blah.py and check if you can open this file

      EDIT:

      In that case you can not. (python arg means that you call python.exe whit some parameters which python assume that is filename of script you want to run)

      You can create bat file whit lines in your path map and run .bat file

      Example:
      In one of Path maps create blah.py.bat Edit file and put line

      python C:\Somedir\blah.py 

      You can now run blah.py from anywere, becuase you do not need to put .bat extention when running bat files

      2
      • python in PATH. And directory which contains blah.py also in PATH. The main idea is to execute python script without writing full path to it. But now I have problems with arguments passing.
        – ton4eg
        CommentedDec 20, 2009 at 2:32
      • 3
        Ralu, you don't need a batch file to execute a python script this way. Use the PATHEXT environment var to include .py and .pyw as executable extensions. This var is why you don't need to specify .bat either.
        – Todd
        CommentedDec 20, 2009 at 18:40
      1

      Found an incredibly useful answer here: How to run different python versions in cmd?

      I would suggest using the Python Launcher for Windows utility that introduced was into Python 3.3 a while ago. You can also manually download and install it directly from the author's website for use with earlier versions of Python 2 and 3.

      Regardless of how you obtain it, after installation it will have associated itself with all the standard Python file extensions (i.e. .py, .pyw, .pyc, and .pyo files). You'll not only be able to explicitly control which version is used at the command-prompt, but also on a script-by-script basis by adding Linux/Unix-y shebang #!/usr/bin/env pythonX comments at the beginning of your Python scripts.

      As J.F. Sebastian suggests, Python Launcher for Windows is the best and default choice for launching different version of Python in Windows. It used to be a third-party tool, but now it is officially supported since Python 3.3.

      New in version 3.3.

      The Python launcher for Windows is a utility which aids in the location and execution of different Python versions. It allows scripts (or the command-line) to indicate a preference for a specific Python version, and will locate and execute that version.

      This is a great tool just use it!

        0

        Simply run the command:

        C:>python .\file_name.py 

        Assuming the file name is within same folder and Python has already been added to environment variables.

          Start asking to get answers

          Find the answer to your question by asking.

          Ask question

          Explore related questions

          See similar questions with these tags.