2014-06-23 6 views
0

Je suis débutant en Python. J'ai déjà essayé de chercher la réponse à cette question depuis longtemps mais je n'ai pas eu de chance avec ça. Quoi qu'il en soit, voici le code que je veux courir (je sauvé comme test.py):Écrire un script Python dans PowerShell: comment utiliser argv?

from sys import argv 
    script, firstArgument = argv 
    print "Hello %s!" %firstArgument 

Il fonctionne parfaitement bien si je tape ceci dans PowerShell:

>> cd ~ 
    >> Python test.py "StackOverflow" 

Cependant, si je tente de saisir le code dans PowerShell comme ceci:

>> cd ~ 
    >> Python 
    >> from sys import argv 
    >> script, firstArgument = argv 

je reçois une énorme erreur à ce moment-là ... Je me demande, est-il un moyen de déclarer argv directement dans le PowerShell ou est-il pas possible? -Merci

Répondre

2

Lorsque vous invoquez python seul pour l'obtenir en mode interactif, il n'y a pas d'arguments transmis. Par conséquent, argv est vide.

Je suis en cours d'exécution sur Ubuntu, mais il est le même concept général Windows:

:~ $ python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from sys import argv 
>>> print argv 
>>> [''] 

Powershell et Python sont deux choses distinctes, chacune avec leurs propres concepts des arguments qui leur sont passés. Tout comme un script bash a le concept d'arguments transmis, il en va de même pour Powershell, bien qu'ils soient gérés différemment. Cependant, aucun n'est directement connecté à argv de Python.

En général, on peut utiliser environment variable s pour passer les choses et-vient entre Python et le shell (vous pouvez définir environment variable s à l'intérieur de Python qui pourraient être lus dans la coquille ou vice versa, mais dans les deux cas, ces serait différent de argv, qui est spécifiquement les arguments transmis à l'exécutable python). Ou on pourrait utiliser les variables d'environnement du shell pour déterminer quels arguments devraient être passés à python, déterminant ainsi ce que sera argv.

Voir ce lien pour plus de détails: https://docs.python.org/2/library/sys.html#sys.argv

Modifier en réponse au commentaire de OP:

Vous ne pouvez pas déclarer argv, en tant que tel. C'est représentatif de la façon dont l'interprète a été invoqué, et en mode interactif, par définition, il n'a aucun argument.

Pour votre exemple spécifique, cela a à voir avec la façon dont tuple s sont déballés dans Python et l'état actuel de argv, qui est une chaîne vide.

:~ $ python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from sys import argv 
>>> firstArgument=argv 
>>> print firstArgument 
[''] 
>>> firstArgument, secondArgument=argv 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 1 value to unpack 

Depuis argv n'a qu'un seul élément, vous ne pouvez pas l'attribuer à deux variables.

Vous pouvez, par exemple, faites ceci:

>>> firstArgument, secondArgument=argv,1 
>>> print secondArgument 
1 

Maintenant, il y a en fait deux valeurs - le tuple ('', 1), et il peut être décompressé dans les deux variables différentes .

+0

Ah ok, vous venez de répondre à ma question. Pourquoi ai-je une erreur si j'essaie de déclarer plus d'un argv en mode interactif? Par exemple: >> firstArgument = argv (fonctionne bien) contre >> firstArgument, secondArgument = argv (erreur!). Désolé, je ne me suis pas encore habitué à la mise en forme de StackOverflow. De plus, existe-t-il un moyen d'initialiser ou de donner des valeurs à ces arguments? –

+0

va éditer la réponse w/add'l info – khampson

+0

Ajout d'informations de suivi basées sur votre commentaire. Veuillez accepter ma réponse, car elle a répondu à votre question (voir http://stackoverflow.com/tour pour plus d'informations). – khampson

Questions connexes