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


92

У меня есть простой скрипт 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.

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


3
публикация фрагмента кода может помочь вам.
jldupont

Человек без хрустального шара уже дал решение =) print sys.argv [1] выдает эту ошибку.
ton4eg

Если у вас установлено несколько версий Python, вам может понадобиться этот stackoverflow.com/questions/1934675/… .
laike9m

Вручную указать python запустить мой скрипт из реестра: "C: \ Python27 \ python.exe" "C: \ Python27 \ tpt.py" "% 1" `

Ответы:


144

Когда вы выполняете сценарий без ввода «python» перед ним, вам необходимо знать две вещи о том, как Windows вызывает программу. Во-первых, нужно выяснить, что это за файл, по мнению Windows:

    C: \> ассоциированный .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


30
Даже если 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/…
parvus

5
@parvus Ваш комментарий стал для меня лучшим решением. Даже при правильном чтении ассоциаций эти два ключа были установлены неправильно.
Nathan Cox

1
Я также столкнулся с проблемами, когда HKEY_CLASSES_ROOT \ .py \ OpenWithProgids был настроен на что-то, связанное с VisualStudio, в частности, когда я пытаюсь запустить сценарии Python в своих тестах AppVeyor. См. Help.appveyor.com/discussions/problems/… .
Джек О'Коннор,

1
У меня похожая проблема. Anaconda по умолчанию добавила раздел реестра с отсутствующим% *
prasad

В Win10 я пишу test.py 123и печатаю 123как sys.argv[1]. Microsoft что-то изменила?
Hrvoje T

22

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

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

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


16

Кроме того, если вы хотите иметь возможность запускать сценарии 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:\>

4

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

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

T\:> blah.py argument

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

T:\> blah argument

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

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

T:\> py -3 blah.py argument

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


Python Launcher находится в стадии бета-тестирования.
Николас Барбулеско

@NicolasBarbulesco: Программа запуска Python включена в Python 3.3, т.е. она достаточно хороша
jfs

Может быть. Но установить Python 3 на Windows мне не удалось . Может ты сможешь мне помочь здесь.
Николас Барбулеско

4

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

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

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

Для скрипта Python testсоздайте два файла: a test.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 неуклюже и излишне. Я бы не рекомендовал это.
Tripleee

2

В Windows ,

Чтобы запустить модуль python без ввода «python» ,

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

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

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

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

Чтобы запустить модуль питона без ввода «.py» расширение

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


1

Найдено невероятно полезный ответ здесь : Как запускать различные версии питона в ЦМД?

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

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

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

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

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

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


0

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

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

РЕДАКТИРОВАТЬ:

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

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

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

python C:\Somedir\blah.py

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


python в PATH. И каталог, который содержит blah.py также в PATH. Основная идея - выполнить скрипт python без записи полного пути к нему. Но теперь у меня проблемы с передачей аргументов.
ton4eg

3
Ралу, вам не нужен командный файл для выполнения скрипта Python таким образом. Используйте переменную среды PATHEXT, чтобы включить .py и .pyw в качестве исполняемых расширений. Именно поэтому вам не нужно указывать .bat.
Тодд

0

Если я так понял, это так:

C:\Users\(username)\AppData\Local\Programs\Python\Python(version)

КОПИРУЙТЕ (не удаляйте) python.exe, переименуйте его в py.exe и выполните:

py filename.py

0

Просто запустите команду:

C:>python .\file_name.py

Предполагая, что имя файла находится в той же папке, а Python уже добавлен в переменные среды.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.