Script Parameters with PyCharm - Learn Python the Hard way - python

I started to learn Python with learn Python the Hard Way and I am facing some issues with ex13. I would like to now if it is a mistake of mine or because of the way PyCharm works.
Basically to make the script work as the exercise suggests I saw I have to manually enter the parameters names in PyCharm with run>edit configuration
I put "first" "second" and "third"
But I would like to combine raw_input and argv so I can let the user choose the name of the parameters. Here's what I wrote:
from sys import argv
first = raw_input("First argument: ")
second = raw_input("Second argument: ")
third = raw_input("Third argument: ")
script, first, second, third = argv
print "The script is called:", script
print "Your first variable is:", first
print "Your second variable is:", second
print "Your third variable is:", third
It runs but it returns:
ValueError: need more than 1 value to unpack
It seems that in PyCharm I have to enter manually all the script parameters ? There is no way to combine it with raw input ?
Thanks for your help.

note check out Joran's answer which shows a good combination of using command line args and prompting for user inputs. Below is a break down of what is going on:
This is expected behaviour in PyCharm to specify the parameters you want PyCharm to execute your script with. Think of it like PyCharm doing something like this:
python my_script.py
However, PyCharm does not know the arguments you want to pass, you need to provide this, so it knows how to run your script. If you look near the bottom of your PyCharm window, there is a Terminal tab. You can use that to quickly execute your script and provide args.
Secondly, the reason why you are getting the error you are getting is because you are not handling your script inputs properly when trying to use argv.
You are mixing up using raw_input, which takes in user input when your Python script is running, as opposed to argv which takes parameters in to your Python script when you run it.
So, what you are looking to actually do here, is not use raw_input, but simply argv. Here is a small demo to clarify all this:
from sys import argv
script, first, second, third = argv
print "The script is called:", script
print "Your first variable is:", first
print "Your second variable is:", second
print "Your third variable is:", third
Now, go in to your command prompt and do this:
python my_script one two three
You will get:
The script is called: my_script.py
Your first variable is: one
Your second variable is: two
Your third variable is: three
This is a very simplified example, and you're probably going to need to add some handling of your inputs, or you're going to get a lot of errors with different inputs to your script. With that, I suggest maybe looking at argparse instead

Im not sure i understand the question ... but the code below will use the command line arguments if there are 3(or more) ... otherwise it will prompt and split the same way as the shell splits command line arguments
import shlex # shlex.split will split the string the same way that the shell would for command line args
if len(sys.argv) < 3:
args = (list(sys.argv) + shlex.split(raw_input("Enter Args:")))[:3]
else:
args = sys.argv[:3]
print "Using Args:",args
one,two,three = args

Related

Running a program in Spyder that takes a command line argument is giving me list index out of range error [duplicate]

I'm running the code below in Spyder.
I have typed it in a py file and simply hit the run button.
When I try to run it I get the error:
ValueError: need more than 1 value to unpack
As shown here you are meant to give the inputs for the argv variable before running the program but I don't know how to do this is spyder?
http://learnpythonthehardway.org/book/ex13.html
from sys import argv
script, first, second, third = argv
print "The script is called:", script
print "The first variable is:", first
print "The second variable is:", second
print "Your third variable is:", third
To pass argv to a script in Spyder, you need to go the menu entry
Run > Configuration per file
or press the Ctrl+F6 key, then look for the option called
Command line options
on the dialog that appears after that, and finally enter the command line arguments you want to pass to the script, which in this case could be
one two three
In addition to configuring in the Run->Configure as explained in other answers,
you can use "runfile" directly from the console.
Run the following:
runfile('ex13.py', args='first second third')
In Spyder, go Run > Configure and define your argv values as showing in following diagram and to run the script just press F6
Read the FAQ at the bottom of the page, it specifically mentions this error.
Common Student Questions
Q. When I run it I get ValueError: need more than 1 value to unpack.
Remember that an important skill is paying attention to details. If you look at the What You Should See section you see that I run the script with parameters on the command line. You should replicate how I ran it exactly.
Make sure you run the command:
$ python ex13.py first 2nd 3rd
>> The script is called: ex13.py
>> Your first variable is: first
>> Your second variable is: 2nd
>> Your third variable is: 3rd
You can ensure that the arguments are supplied.
if __name__ == '__main__':
if len(argv) == 4:
script, first, second, third = argv
print 'The script is called:', script
print 'Your first variable is:', first
print 'Your second variable is:', second
print 'Your third variable is:', third
else:
print 'You forgot the args...'

creating python code on IDLE then using it in macOS terminal

I'm wondering how I can utilize my code on IDLE to work within the macOS Terminal.
For example, I created a function such as:
def multiplication_by_2(x): return 2 * x
and saved the .py file in a desktop folder.
I want to use terminal to test out various cases such as multipication_by_2(100) etc, however I am unsure about which commands to enter in terminal to achieve this.
Any direction toward this would be helpful. Thank you.
Try this at the end of the code:
number = int(str(input("Enter the number you would like to multiply by 2: ")))
multiplication_by_2(number)
This way, you get user input. Then, in the terminal:
$ python3 <filename>.py
Which should produce the output:
Enter the number you would like to multiply: <your input, ex. 100>
200
Hope that solved it!
If you are asking how to send arguments to your program through the command line, python's sys library has a list named argv that holds arguments passed from the command line. Add this to your python file:
from sys import argv
for argument in argv:
print(multipication_by_2(int(argument))) # All arguments are strings by default
Then in the command line, do python file_name.py 20 50 1 and any other number you might want to try, and the program will print its double.
Note: If your command line says python doesn't exist, try python3.

Increasing understanding of Python argument variable

For the following Python script named ex13.py:
from sys import argv
script, first, second, third = argv
print("The script is called:", script)
print("Your first variable is:", first)
print("Your second variable is:", second)
print("Your third variable is:", third)
I have a question about the following line of code:
script, first, second, third = argv
We are saying assign argv to four variables on the left in this order.
Then when I, use this script in my terminal:
python ex13.py first 2nd 3rd
I understand that we are passing variables to a script using the terminal as an input method. However what's confusing me is this.
When I was writing basic Python scripts the way I would call them is with:
python ex3.py
Am I correct in saying that this python ex3.py is not passing a single command line argument and python ex13.py first 2nd 3rd is passing several?
When working from the command line, argv returns a list of the command line arguments, where the first (at place zero argv[0] we get the python file name that was used after the pyhton name).
from place one and up, the values are related to the order in which arguments was recieved. take note that if you use optional arguments (python myscript.py -p 127.0.0.1) those are counted in argv too. so you will get argv[1] == -p
Am I correct in saying that this python ex3.py is not passing a single
command line argument and python ex13.py first 2nd 3rd is passing
several?
no, you are incorrect, python ex3.py is passing 1 argument, argv[0] = ex3.py.

Learn Python The Hard Way Exercise 13 (using pycharm) - execute a script in console

I am obviously new to python and I've spent the last 1.5 hours beating my head against the wall trying to get this exercise done. It should be relatively simple, and I'm sure using an IDE when I'm new is probably not doing me any favors.
Basically I have this script:
from sys import argv
script, first, second, third = argv
print "The script is called:", script
print "Your first variable is:", first
print "Your second variable is:", second
print "Your third variable is:", third
I type the above in the editor and then I have the file saved as "ex13.py". When I then try to run the script in the python console I am continually told that the name is not defined. I would really appreciate any help getting this resolved, I am basically stuck and can't progress until I figure out how to run this damn script in pycharm.
Under the run dropdown menu at the top of the pycharm IDE you should find edit configurations. Click on that and write your three arguments in script paramaters. Then run it
in that book pointed you need pass three argument in terminal like this
python ex13.py first 2nd 3rd
and if you pass more than 3 argument like what am i did, it will make you an error, like this:
python .\ex13.py first 2nd 3rd 4th
Traceback (most recent call last):
File ".\ex13.py", line 3, in <module>
script,first,second,third= argv
ValueError: too many values to unpack
so, pass just three argument according to that code in book, Ex13, you'll see it work

ValueError: need more than 1 value to unpack - Learn Python the Hard Way Ex: 13

I've looked through the questions that have already been answered but I am still confused. I've run the code 100 times and I keep getting the same "ValueError: need more than 1 value to unpack" error so obviously something is not computing (see what I did there?) for me. Can someone look at my code and explain to me like you would a child what i've screwed up?
Obviously i've deviated from the terms in the lesson out of sheer frustration
What I have written is:
from sys import argv
script, called, coding, confusing = argv
print "The script is called:", script
print "Your first variable is:", called
print "Your second variable is:", coding
print "Your third variable is:", confusing
Is there a special something I should type in terminal or am I just missing bits of code?
argv is a tuple containing the argument the script was called with. You need to pass your script the necessary number of arguments when you call it:
python myscript.py param_called param_coding param_confusing
To go further:
You are using a syntax called unpacking. This means the left hand side is not a single variable but rather a "sequence" (tuple) of variables. On the left hand side you need a sequence too that has the same number of elements, like a list or tuple. Each variable on the left hand side will be assigned the corresponding value from the right hand side. See the tutorial about tuples and sequences (last paragraph).
About your left hand side, argv or better sys.argv, this is a tuple that contains the script name as first element and the command line parameters. See argv.
All put together: you want to unpack sys.argv which is in the above example ("script.py", "param_called", "param_coding", "param_confusing") into script,called,coding,confusing, so the variable script will be affected the string "script.py", called the string "param_called", etc.
The drawback of this method is that if the command line has too few or too many arguments, the unpacking fails.
Your code is correct, but as specified in the instructions you must put 3 "arguments" into the command prompt
ex: $ python ex13.py called coding confusing
the above prints this out to the command prompt:
The script is called: ex13.py
Your first variable is: called
Your second variable is: coding
Your third variable is: confused

Categories