0

myfile.sh

#!/bin/bash
echo -e "\n starting python script"
python main.py arg1
echo -e "\n done"

This is not working.

Above file has given following error

starting python script
Traceback (most recent call last):
  File "main.py", line 97, in <module>
    main()
  File "main", line 80, in main
    header = "arg1: {}\n\n".format(sys.argv[1])
ValueError: zero length field name in format

done

main.py

...
...
def main():
    """ main function
    """

    header = "arg1: {}\n\n".format(sys.argv[1])
    ...
    ...


if __name__ == "__main__":

    if len(sys.argv) == 2:
        main()
    else:
        print "\n Invalid no. of arguments"
        print "\n Usage:"
        print "\n python {} <date>\n".format(sys.argv[0])
        exit(1)

Whats the correct syntax to call a python script having arguments from shell script ?

6
  • Could you please be a little more precise? Maybe with a toy example? Commented Aug 11, 2014 at 12:31
  • 2
    Yes it is correct, what do you mean for not working? bash throws an error, python throws an error? Commented Aug 11, 2014 at 12:32
  • What is your Python version? Could we please get the python script? Commented Aug 11, 2014 at 12:39
  • @user189 updated question with main.py contents and my python version is 2.6.2 Commented Aug 11, 2014 at 12:44
  • 2
    Change {} --> {0}, or maybe upgrade to 2.7 if possible. So this is not problem of calling python, but a rather a problem of using the wrong syntax for the your python version. Commented Aug 11, 2014 at 12:59

2 Answers 2

2

Your script should work fine. Here is a toy sample:

#!/bin/bash
echo -e "\n starting python script"
python main.py arg1 arg2 arg3
echo -e "\n done"

with main.py as

#!/usr/bin/env python
from __future__ import print_function
import sys

print("In python pgm called from shell script with args:")
for i, a in enumerate(sys.argv):
    print("argument {0} is {1}".format(i, a))

The error is probably caused by the '{}'. Need to have a recent enough python version for that to work (2.7 or better to be on the safe side...). Otherwise specify the positional argument numbers.

Sign up to request clarification or add additional context in comments.

Comments

0

Yes, this is correct. Try this for example:

main.py

import sys
print sys.argv[1]

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.