2012-04-23 14 views
5

Sé que mi título no es descriptivo, así que permítanme tratar de explicarlo aquí.Guión de Python perdiendo argumentos cuando se ejecuta desde PATH en Windows

Normalmente ejecuto mi script en Python, así:

D:\github\Miscellaneous-Programs\Python>python check.py -h 
hello 
['check.py', '-h'] 

Ahora lo que hice se añade la carpeta D:\github\Miscellaneous-Programs\Python en mis ventanas path ambiente variables. Que traté de ejecutar mi script como el siguiente:

C:\Users\noob>check -h 
hello 
['D:\\github\\Miscellaneous-Programs\\Python\\check.py'] 

Como se puede ver que no mostró el argumento -h I suministrada a la misma.

Mi check.py

import sys 
print "hello" 
print sys.argv 

Si quito print sys.argv del script en Python mencionado anteriormente que funcione bien en ambos casos que he mencionado anteriormente es decir, se imprime "Hola" muy bien.

Por lo tanto, mi pregunta es cómo se ejecuta una secuencia de comandos python que acepta algunos argumentos de línea de comandos después de que la secuencia de comandos se agrega a la variable de entorno.

Mi propósito es ejecutar mi python script desde cualquier lugar en el símbolo del sistema de Windows que es algo similar a chmod +x check.py.

Probé la opción chmod en cygwin, funciona bien para ambos casos.

Cygwin output

[email protected] ~ 
$ chmod +x check.py 

[email protected] ~ 
$ ./check.py h 
['./check.py', 'h'] 
+2

crea un archivo .bat que contiene 'python full \ path \ to \ check.py' y agrega el directorio que contiene ese .bat a' Path' (es posible que desees poner 'echo off' al comienzo de .bat – khachik

+0

Sugeriría cambiar el título a algo un poco más descriptivo, por ej. "Ejecutar un script Python desde PATH descarta todos los argumentos de línea de comandos excepto el primero" para que otras personas que tengan el mismo problema lo encuentren. – mensi

+0

¿Realmente fue? 'C: \ Users \ noob> check -h' no' C: \ Users \ noob> check.py -h'? –

Respuesta

6

Windows no tiene una noción de archivos de comandos ejecutables con el intérprete da como #!, así que lo que pretende hacer no puede trabajar. Lo que Windows hace es llamar a la función API de Windows ShellExecute el que hace lo siguiente:

Sin embargo, es más comúnmente utilizado para poner en marcha una aplicación que opera en un archivo en particular. Por ejemplo, los archivos .txt se pueden abrir por Microsoft WordPad. El verbo abierto para un archivo .txt sería así corresponden a algo como el siguiente comando:

"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1" 

see MSDN

Como se puede ver, sólo el parámetro primera se suministra a la aplicación. En su caso, esto se traduce en algo en la línea de:

"C:\Program Files\Python\Python.exe" "D:\github\Miscellaneous-Programs\Python\check.py" 

Lo que puede hacer para evitar esto es crear un pequeño archivo .bat llamado check.bat:

python check.py %* 

(Ver this SO question para más detalles . También podría tener que proporcionar una ruta absoluta para el control.Py o Python si no se pueden encontrar)

+0

Gracias, por la respuesta que funcionó como sugirió. Aceptaré su respuesta esperando otras sugerencias alternativas: D. – RanRag

+0

* Windows no tiene una noción de archivos de script ejecutables con el intérprete dado como # !, entonces lo que intenta hacer no puede funcionar * Windows no tiene una noción de shebang, pero esto no significa que no pueda ejecutar varios scripts al dar sus nombres en la línea de comando. Por cierto, hay una buena herramienta que hace que shebang funcione en Windows - [Lanzador de Python] (https://bitbucket.org/vinay.sajip/pylauncher/). –

+0

'ShellExecute' es la función WinAPI utilizada por el sistema en el proceso de ejecutar comandos como' script.py -h' y sin saber cómo el sistema usa esta función no puede describir todo el proceso. Tu respuesta es incorrecta –

4

Poner la carpeta en el PATH no influye en la forma en que el sistema actúa cuando ejecuta algún script escribiendo script.py -h en la línea de comandos. Lo que ocurre es que el sistema lee el registro para descubrir cómo ejecutar el comando que usted dio. Puede visualizar esta información ejecutando primero reg query HKCR\.py /ve y luego tomando el resultado (que normalmente es Python.File) y ejecutando reg query HKCR\Python.File\shell\open\command /ve. La salida en mi sistema es "C:\Program Files\Python Launcher (64-bit)\py.exe" "%1" %*. Esto significa que cuando el sistema ve el comando script.py -h ejecuta el programa py.exe y el primer parámetro es el nombre del script (eso es lo que significa "%1") y el resto de los parámetros del script (eso es lo que %*) significa. Supongo que su problema está causado por la falta de %* parte en la entrada de registro adecuada.

+0

Mi salida para 'regquery':' (Predeterminado) REG_SZ "C: \ Python26 \ python.exe" "% 1"% * '. Asi que. no falta '% *' – RanRag

+0

Esto fue muy útil para mí. – class

+0

No había tenido este problema hasta hace poco, pero recientemente instalé Python 3.4 en una computadora nueva con Python Launcher incluido y ahora gracias a esta respuesta descubrí que la entrada de registro para archivos '.py' (usando la clase de archivo' py_auto_file', aparentemente) fue agregado sin el '% *' por alguna razón. – JAB

Cuestiones relacionadas