Как выполнить скрипты Python в Windows?

У меня есть простой script blah.py(с использованием Python 2):

import sys
print sys.argv[1]

Если я выполнил свой script с помощью:

python c:/..../blah.py argument

Он печатает аргумент, но если я выполняю script по:

blah.py argument

возникает ошибка:

IndexError...

Итак, аргументы не переходят к script.

python.exe в PATH. Папка с blah.py также в PATH.
python.exe - программа по умолчанию для выполнения файлов *.py.

В чем проблема?

Ответ 1

Когда вы выполняете script без ввода "python" спереди, вам нужно знать две вещи о том, как Windows вызывает программу. Сначала нужно выяснить, какой файл Windows считает:

    C:\>assoc .py
    .py=Python.File

Далее вам нужно знать, как Windows выполняет действия с этим расширением. Он связан с типом файла "Python.File", поэтому эта команда показывает, что он будет делать:

    C:\>ftype Python.File
    Python.File="c:\python26\python.exe" "%1" %*

Итак, на моей машине, когда я набираю "blah.py foo", она выполнит эту точную команду без каких-либо различий в результатах, чем если бы я сам набрал всю вещь:

    "c:\python26\python.exe" "blah.py" foo

Если вы наберете то же самое, включая кавычки, тогда вы получите результаты, идентичные тому, когда вы просто наберете "blah.py foo". Теперь вы в состоянии выяснить остальную часть своей проблемы для себя.

(Или опубликуйте более полезную информацию в своем вопросе, например, фактические вырезанные и вставляемые копии того, что вы видите на консоли. Обратите внимание, что люди, которые делают подобные вещи, голосуют за свои вопросы и получают очки репутации, и больше людей, вероятно, помогут им с хорошими ответами.)

Введенный из комментариев:

Даже если атрибуты 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

к тому же значению. См. http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

пример реестра для python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command Путь к реестру может отличаться, используйте python26.exe или python.exe или в зависимости от того, что уже находится в реестре.

введите описание изображения здесь HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

Ответ 2

вы должны сделать приложение по умолчанию для обработки файлов python be python.exe.

щелкните правой кнопкой мыши файл *.py, выберите "Открыть с". Там выберите "python.exe" и отметьте "всегда используйте эту программу для этого типа файла" (что-то вроде этого).

тогда ваши файлы python будут всегда запускаться с помощью python.exe

Ответ 3

Кроме того, если вы хотите иметь возможность запускать скрипты python без ввода .py (или .pyw) в конце имени файла, вам нужно добавить .py (или .PY;.PYW) в список расширений в переменной среды PATHEXT.

В Windows 7:

щелкните правой кнопкой мыши на компьютере
щелкните левой кнопкой мыши Свойства
щелкните левой кнопкой мыши Дополнительные параметры системы
щелкните левой кнопкой мыши вкладку "Дополнительно"
щелкните левой кнопкой мыши переменные среды...
под "системными переменными" прокрутите страницу вниз, пока не увидите PATHEXT
щелкните левой кнопкой мыши на PATHEXT, чтобы выделить его
щелкните левой кнопкой мыши Изменить...
Измените "переменное значение" так, чтобы он содержал ;.PY (конечный ключ пропустит до конца)
щелкните левой кнопкой мыши OK
щелкните левой кнопкой мыши OK
щелкните левой кнопкой мыши OK

Примечание №1: окна командной строки не видят, что изменение не будет закрыто и повторно открыто.

Примечание №2: разница между расширениями .py и .pyw заключается в том, что первая команда запускает командную строку при запуске, а вторая - нет.

На моем компьютере я добавил ;.PY;.PYW в качестве последних (с самым низким приоритетом) расширений, поэтому значения "before" и "after" 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:\>

Ответ 4

Как выполнить скрипты Python в Windows?

Вы можете установить pylauncher. Он используется для запуска файлов .py,.pyw,.pyc,.pyo и поддерживает несколько установок Python:

T\:> blah.py argument

Вы можете запустить свой Python script без указания расширения .py, если в переменной среды PATHEXT есть .py,.pyw:

T:\> blah argument

Он добавляет поддержку строки заголовка shebang (#!), чтобы выбрать нужную версию Python для Windows, если у вас установлено несколько версий. Вы можете использовать * nix-совместимый синтаксис #! /usr/bin/env python.

Вы можете указать версию явно, например, для запуска с использованием последней установленной версии Python 3:

T:\> py -3 blah.py argument

Он также должен исправить вашу проблему sys.argv как побочный эффект.

Ответ 5

Я столкнулся с той же проблемой, но в контексте необходимости пакета моего кода для пользователей Windows (из Linux). Мой пакет содержит несколько сценариев с параметрами командной строки.

Мне нужны эти сценарии для установки в соответствующем месте на компьютерах пользователей Windows, чтобы они могли вызывать их из командной строки. Поскольку пакет предположительно удобен для пользователя, попросить моих пользователей изменить свой реестр для запуска этих сценариев было бы невозможно.

Я столкнулся с решением, которое люди в Continuum используют для скриптов Python, которые поставляются вместе с их пакетом Anaconda. Для примера просмотрите каталог Anaconda/Scripts.

Для Python script test создайте два файла: a test.bat и a test-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 script:

import sys
print sys.argv

Если вы оставите эти два файла в своем локальном каталоге, вы можете вызвать свой Python script через файл .bat, выполнив

test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']

Если вы скопируете оба файла в место, которое находится на вашем PATH (например, Anaconda\Scripts), вы можете даже вызвать ваш script, оставив суффикс .bat

test hello world
['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']

Отказ от ответственности: я понятия не имею, что происходит и как это работает, и поэтому будет благодарно за любое объяснение.

Ответ 6

В Windows,

В запустите модуль python без ввода "python" ,

- > Щелкните правой кнопкой мыши любой файл python (*. py)

- > Установите для свойства open значение "python.exe"

- > Проверьте "всегда используйте эту программу для этого типа файла"

- > Добавить путь к python.exe в переменную среду, например. присоединять C:\Python27 для переменной среды PATH.

В Запустите модуль python, не набрав расширение ".py"

- > Измените системную переменную PATHEXT и добавьте расширение ".PY" в список.

Ответ 7

Вы можете выполнить python.exe с любой карты? Если вы этого не сделаете, попробуйте, если у вас есть правильные значения для python.exe в среде PATH

Вы находитесь в том же каталоге, что и blah.py. Проверьте это, выписав команду → отредактируйте blah.py и проверьте, можете ли вы открыть этот файл

EDIT:

В этом случае вы не можете. (python arg означает, что вы вызываете python.exe с некоторыми параметрами, которые python предполагает, что это имя файла script, которое вы хотите запустить)

Вы можете создать строки bat file whit на карте пути и запустить файл .bat

Пример:
На одной из карт Path создайте blah.py.bat Отредактируйте файл и поместите строку

python C:\Somedir\blah.py

Теперь вы можете запустить blah.py с любого из них, потому что вам не нужно класть расширение .bat при запуске файлов bat.

Ответ 8

Найден невероятно полезный ответ здесь: Как запустить разные версии python в cmd?

Я бы предложил использовать утилиту Python Launcher для Windows, которая была введена в Python 3.3 некоторое время назад. Вы также можете вручную загрузить и установить его непосредственно с веб-сайта автора для использования с более ранними версиями Python 2 и 3.

Независимо от того, как вы его получите, после установки он будет связан со всеми стандартными расширениями файлов Python (т.е..py,.pyw,.pyc и .pyo файлы). Вы не только сможете явно контролировать, какая версия используется в командной строке, но и на основе script -by- script, добавив Linux/Unix-y shebang #!/Usr/bin/env pythonX в начале ваших сценариев Python.

Как говорит Дж. Ф. Себастьян, Python Launcher для Windows - лучший и по умолчанию выбор для запуска другой версии Python в Windows. Это был сторонний инструмент, но теперь он официально поддерживается с Python 3.3.

Новое в версии 3.3.

Пусковая установка Python для Windows - это утилита, которая помогает размещать и выполнять разные версии Python. Это позволяет скриптам (или командной строке) указывать предпочтение конкретной версии Python и будет находить и выполнять эту версию.

Это отличный инструмент, просто используйте его!