У меня есть простой скрипт blah.py (на Python 2):
import sys
print sys.argv[1]
Если я выполню свой сценарий:
python c:/..../blah.py argument
Он печатает аргумент, но если я выполню сценарий:
blah.py argument
возникает ошибка:
IndexError ...
Так что аргументы в скрипт не передаются.
python.exe в PATH. Папка с blah.py тоже в PATH.
python.exe - это программа по умолчанию для выполнения файлов * .py.
В чем проблема?
Ответы:
Когда вы выполняете сценарий без ввода «python» перед ним, вам необходимо знать две вещи о том, как Windows вызывает программу. Во-первых, нужно выяснить, что это за файл, по мнению Windows:
Затем вам нужно знать, как Windows выполняет что-то с этим расширением. Он связан с типом файла "Python.File", поэтому эта команда показывает, что он будет делать:
Итак, на моем компьютере, когда я набираю «blah.py foo», он выполнит эту точную команду, без разницы в результатах, чем если бы я сам набрал ее полностью:
Если вы наберете то же самое, включая кавычки, вы получите результат, идентичный тому, когда вы просто наберете «blah.py foo». Теперь вы можете сами решить остальную часть своей проблемы.
(Или разместите более полезную информацию в своем вопросе, например, фактические копии того, что вы видите в консоли, и вставьте их. Обратите внимание, что люди, которые делают такие вещи, голосуют за свои вопросы, и они получают очки репутации, и больше людей могут помочь им с хорошими ответами.)
Принесено из комментариев:
Даже если assoc и ftype отображают правильную информацию, может случиться так, что аргументы будут удалены. Что может помочь в этом случае, так это непосредственное исправление соответствующих ключей реестра для Python. Установить
ключ к:
"C:\Python26\python26.exe" "%1" %*
Вероятно, ранее
%*
отсутствовал. Аналогично установитек той же стоимости. См. Http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/
HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command
Путь реестра может изменяться, использоватьpython26.exe
илиpython.exe
или в зависимости от того , уже в реестре.HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
источник
assoc
иftype
отображать правильную информацию, может случиться так, что аргументы будут удалены. Что может помочь в этом случае, так это непосредственное исправление соответствующих ключей реестра для Python. УстановитеHKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command
ключ на:"C:\Python26\python26.exe" "%1" %*
Вероятно, ранее%*
отсутствовал. Точно так же установитеHKEY_CLASSES_ROOT\py_auto_file\shell\open\command
такое же значение. См. Eli.thegreenplace.net/2010/12/14/…test.py 123
и печатаю123
какsys.argv[1]
. Microsoft что-то изменила?вы должны сделать приложение по умолчанию для обработки файлов python python.exe.
Щелкните правой кнопкой мыши файл * .py и выберите диалоговое окно «Открыть с помощью». Там выберите «python.exe» и отметьте «всегда использовать эту программу для этого типа файлов» (что-то в этом роде).
тогда ваши файлы python всегда будут запускаться с использованием python.exe
источник
Кроме того, если вы хотите иметь возможность запускать сценарии python, не вводя
.py
(или.pyw
) в конце имени файла, вам необходимо добавить.PY
(или.PY;.PYW
) в список расширений в переменной среды PATHEXT.В Windows 7:
щелкните правой кнопкой мыши Компьютер,
щелкните
левой кнопкой мыши Свойства щелкните левой кнопкой мыши Дополнительные параметры системы щелкните
левой кнопкой мыши вкладку Дополнительно щелкните
левой кнопкой мыши Переменные среды ... в
разделе «системные переменные» прокрутите вниз, пока не увидите ПУТЬ,
щелкните левой кнопкой мыши ПУТЬ, чтобы выделить его
слева- нажмите "Изменить" ...
Отредактируйте "Значение переменной", чтобы оно содержало
;.PY
(клавиша End перейдет в конец),щелкните
левой кнопкой мыши OK, щелкните
левой кнопкой мыши, щелкните левой кнопкой мыши, щелкните левой кнопкой мыши, щелкните OK
Примечание №1: окна командной строки не будут видеть изменения без закрытия и повторного открытия.
Примечание # 2: разница между
.py
и.pyw
расширений является то , что бывший открывает командную строку при запуске, а второй нет.На своем компьютере я добавил
;.PY;.PYW
в качестве последних (с самым низким приоритетом) расширения, поэтому значения PATHEXT «до» и «после» были:перед:
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
после
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW
Вот несколько поучительных команд:
C:\>echo %pathext% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW C:\>assoc .py .py=Python.File C:\>ftype Python.File Python.File="C:\Python32\python.exe" "%1" %* C:\>assoc .pyw .pyw=Python.NoConFile C:\>ftype Python.NoConFile Python.NoConFile="C:\Python32\pythonw.exe" "%1" %* C:\>type c:\windows\helloworld.py print("Hello, world!") # always use a comma for direct address C:\>helloworld Hello, world! C:\>
источник
Вы можете установить pylauncher . Он используется для запуска файлов .py, .pyw, .pyc, .pyo и поддерживает несколько установок Python:
Вы можете запустить свой скрипт Python без указания расширения .py, если у вас есть .py, .pyw в переменной среды PATHEXT:
Он добавляет поддержку shebang (
#!
строка заголовка) для выбора нужной версии Python в Windows, если у вас установлено несколько версий. Вы можете использовать * nix-совместимый синтаксис#! /usr/bin/env python
.Вы можете указать версию явно, например, для запуска с использованием последней установленной версии Python 3:
T:\> py -3 blah.py argument
Это также должно исправить вашу
sys.argv
проблему в качестве побочного эффекта.источник
Я столкнулся с той же проблемой, но в контексте необходимости упаковать свой код для пользователей Windows (из Linux). В моем пакете есть несколько сценариев с параметрами командной строки.
Мне нужно, чтобы эти сценарии были установлены в соответствующем месте на компьютерах пользователей Windows, чтобы они могли вызывать их из командной строки. Поскольку пакет якобы удобен для пользователя, было бы невозможно попросить моих пользователей изменить их реестр для запуска этих сценариев.
Я наткнулся на решение, которое люди из Continuum используют для скриптов Python, поставляемых с их пакетом Anaconda - посмотрите примеры в вашем каталоге Anaconda / Scripts.
Для скрипта Python
test
создайте два файла: atest.bat
и atest-script.py
.test.bat
выглядит следующим образом (.bat
файлы вAnaconda\Scripts
вызовеpython.exe
с относительным путем, который я адаптировал для своих целей):@echo off set PYFILE=%~f0 set PYFILE=%PYFILE:~0,-4%-script.py "python.exe" "%PYFILE%" %*
test-script.py
ваш настоящий скрипт Python:import sys print sys.argv
Если вы оставите эти два файла в своем локальном каталоге, вы можете вызвать свой скрипт Python через
.bat
файл, выполнивtest.bat hello world ['C:\\...\\test-scripy.py', 'hello', 'world']
Если вы скопируете оба файла в место, которое находится на вашем
PATH
(например,Anaconda\Scripts
), вы даже можете вызвать свой скрипт, не.bat
указав суффиксtest hello world ['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']
Отказ от ответственности: я понятия не имею, что происходит и как это работает, и был бы признателен за любое объяснение.
источник
.bat
оболочки для каждого скрипта Python неуклюже и излишне. Я бы не рекомендовал это.В Windows ,
Чтобы запустить модуль python без ввода «python» ,
-> Щелкните правой кнопкой мыши любой файл python (*. Py)
-> Установите для свойства open with значение "python.exe"
-> Отметьте «всегда использовать эту программу для этого типа файлов»
-> Добавить путь к python.exe в переменную среду, например, добавить C: \ Python27 в переменную среды PATH.
Чтобы запустить модуль питона без ввода «.py» расширение
-> Отредактируйте системную переменную PATHEXT и добавьте в список расширение ".PY".
источник
Найдено невероятно полезный ответ здесь : Как запускать различные версии питона в ЦМД?
Как предполагает Дж. Ф. Себастьян, Python Launcher для Windows - лучший выбор по умолчанию для запуска различных версий Python в Windows. Раньше это был сторонний инструмент, но теперь он официально поддерживается начиная с Python 3.3.
Это отличный инструмент, просто используйте его!
источник
Можете ли вы запустить python.exe с любой карты? Если вы этого не сделаете, проверьте, есть ли у вас правильные значения для python.exe в среде PATH.
Вы находитесь в том же каталоге, что и blah.py. Проверьте это, выполнив команду -> отредактируйте blah.py и проверьте, можете ли вы открыть этот файл
РЕДАКТИРОВАТЬ:
В таком случае нельзя. ( python arg означает, что вы вызываете python.exe с некоторыми параметрами, которые python предполагает, что это имя файла сценария, который вы хотите запустить)
Вы можете создать файл bat линиями на карте путей и запустить файл .bat
Пример:
в одной из карт пути создайте файл редактирования blah.py.bat и поместите строку
Теперь вы можете запускать blah.py из любого устройства, потому что вам не нужно добавлять расширение .bat при запуске файлов bat.
источник
Если я так понял, это так:
КОПИРУЙТЕ (не удаляйте) python.exe, переименуйте его в py.exe и выполните:
источник
Просто запустите команду:
Предполагая, что имя файла находится в той же папке, а Python уже добавлен в переменные среды.
источник