2

I'm trying to run a Python program from the command line so I created a batch file like so:

@py.exe C:\MyPythonScripts\program.py%*
@pause

The script should print a simple message, but when I type "program" in the Windows Run program cmd appears for a second and closes itself. What am I doing wrong?.

This is the code:

#!python3

def printPicnic(itemsDict,leftWidth,rightWidth):
    print('PICNIC ITEMS'.center(leftWidth + rightWidth,'-'))
    for k,v in itemsDict.items():
        print(k.ljust(leftWidth,'.') + str(v).rjust(rightWidth))

picnicItems = {'sandwiches':4, 'apples': 12, 'cups': 4, 'cookies':8000}
printPicnic(picnicItems,12,5)
printPicnic(picnicItems,20,6)

This is my PATH variable:

> C:\Program Files (x86)\Common
> Files\Intel\Shared
> Files\cpp\bin\Intel64;C:\ProgramData\Oracle\Java\javapath;C:\Program
> Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files
> (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS
> Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program
> Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program
> Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files
> (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files
> (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files
> (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files
> (x86)\AMD\ATI.ACE\Core-Static;C:\Program Files
> (x86)\Skype\Phone\;C:\Program
> Files\Java\jdk1.8.0_121\bin;C:\MyPythonScripts;C:\Python34;C:\Program
> Files (x86)\Common Files\Intel\Shared
> Files\cpp\bin\Intel64;C:\ProgramData\Oracle\Java\javapath;C:\Program
> Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files
> (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS
> Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program
> Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program
> Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files
> (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files
> (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files
> (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files
> (x86)\AMD\ATI.ACE\Core-Static;C:\Program Files
> (x86)\Skype\Phone\;C:\Program
> Files\Java\jdk1.8.0_121\bin;C:\Python34\Scripts
3
  • @Farhan.K Code added... Commented Mar 14, 2017 at 14:07
  • So the batch file is called program.bat? Commented Mar 14, 2017 at 19:49
  • Have a look at my answer in here: stackoverflow.com/questions/54847871/… Commented Jul 2, 2019 at 14:18

3 Answers 3

4

Regarding your batch file, I would suggest perform these changes:

You were missing a space inbetween the path and the %*, also enclose the path in quotes to prevent it from breaking when spaces are in the path

@echo off
py.exe "C:\MyPythonScripts\program.py" %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
Sign up to request clarification or add additional context in comments.

4 Comments

I edited the batch file like in your answer and now it works!. But I'm not sure why, I mean what does @echo off do and what's the difference between @py.exe and just py.exe?
@Xcecution the @ symbol hides the command input, but can be replaced by using @echo off, which prevents you from having to use @ before every command
That is wrong, %* does not include the path of the batch file, so it is equivalent to %1 %2 %3 ...! Quoting paths is always a good practice and avoids trouble with white-spaces and other special characters, but the main problem here was the missing space between the path and %*...
If the .py file association is configured to execute via py.exe, then you can run "C:\MyPythonScripts\program.py" directly. The first line of the script can be a shebang to run a particular version of Python. This can be a fully-qualified path such as #!"C:\Program Files\Python36\python.exe" or a virtual Unix-style shebang like #!/usr/bin/python3.
2

The problem in your batch file is a missing SPACE:

@rem               THERE MUST BE A SPACE:
@rem                                 |
@rem                                 V
@py.exe C:\MyPythonScripts\program.py %*
@pause

In addition, I strongly recommend to put quotation marks around paths in order to avoid trouble with white-spaces and other spacial characters.

Comments

0

You can do it using the following method :

@ECHO OFF
setlocal
set PYTHONPATH=C:\Python35 (you version of python)
C:\MyPythonScripts\program.py  %1<-- (you you have arg)  
endlocal

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.