Shebang python on windows

Эмулируем shebang на Windows

На unix системах все сделано очень удобно. Одним из таких удобств является shebang.
Вкратце — shebang позволяет указать нам в какое приложение будет передан тот или иной файл при попытке его выполнить.
Но на операционных системах от Microsoft такого функционала нет, поэтому мы попробуем сделать аналог.

Windows предоставляет нам следующие вещи:

  • переменная PATHEXT: перечисленные через точку с запятой расширения файлов которые могут быть запущены
  • утилита ftype: позволяет создать соответствие между типом файла и программы, которая будет запущена при попытке выполнить файл
  • утилита assoc: позволяет создать соответствие между расширением файла и типом файла

Утилита ftype работает следующим образом:

При этом вызове в реестре будет создана запись для файлов типа shebang и при попытке запуска которого будет вызван исполняемый файл shebang.exe, где %1 — путь к файлу; %* — аргументы с которыми файл был запущен.
При вызове assoc .=shebang будет задано соответствие между файлами с расширением .(то есть — файлы без расширения) и типом файла shebang. Далее вызовем setx /m PATHEXT «%PATHEXT%;.» и готово — теперь при попытке запустить файл без расширения в консоли или с проводника будет запущено приложение shebang.exe.
Код shebang.exe спрятан под спойлер.

Вкратце — shebang.exe принимает в качестве аргумента файл, считывает с него первую строку, достает с нее путь к исполняемому файлу и запускает тот файл с аргументами переданными в shebang.exe, при этом перенаправляя потоки ввода-вывода дочернего процесса в свои собственные и ожидая завершения дочернего процесса. Еще можно добавить ассоциации с другими расширениями файлов. Для примера — .py. Потом при надобности прописывать в скриптах разные версии питона и запускать их без лишних телодвижений.

Вот таким образом мы немного костыльно смогли частично реализовать поддержку shebang на Wndows.

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Я должен поставить #! (shebang) в скриптах Python, и какую форму он должен принимать?

Я должен положить в мой набор скриптов Python? В какой форме?

они одинаково портативны? Какая форма используется больше всего?

Примечание: the торнадо проект использует shebang. С другой стороны,Джанго нет.

10 ответов:

строка shebang в любом скрипте определяет способность скрипта выполняться как автономный исполняемый файл без ввода python предварительно в терминале или при двойном щелчке по нему в файловом менеджере (при правильной настройке). Это не обязательно, но обычно помещается туда, поэтому, когда кто-то видит файл, открытый в Редакторе, они сразу знают, на что они смотрят. Однако, какую линию shebang вы используете и важно.

правильно использование для скриптов Python 3:

по умолчанию используется версия 3.самый последний. Для Python 2.7.последнее использование python2 на месте python3 .

следующее не следует использовать (за исключением редкого случая, когда вы пишете код, который совместим с обоими Python 2.x и 3.x):

причина этих рекомендаций, приведенных в PEP 394, это python может относиться либо к python2 или python3 on различная система. В настоящее время это относится к python2 на большинстве дистрибутивов, но это, вероятно, изменится в какой-то момент.

кроме того, не используйте:

«python может быть установлен в /usr / bin / python или /bin / python в тех случаи, описанные выше #! потерпеть неудачу.»

Это действительно просто дело вкуса. Добавление shebang означает, что люди могут вызывать скрипт напрямую, если они хотят (предполагая, что он помечен как исполняемый); опуская его просто означает python должен быть вызван вручную.

конечный результат выполнения программы не влияет в любом случае, это просто варианты средств.

я должен положить в мой набор скриптов Python?

поместите shebang в скрипт Python, чтобы указать:

  • этот модуль может быть запущен как скрипт
  • может ли он быть запущен только на python2, python3 или он совместим с Python 2/3
  • в POSIX, это необходимо, если вы хотите запустить скрипт напрямую без вызова python исполняемый явно

это одинаково портативный? Какая форма используется больше всего?

если вы пишете shebang вручную тогда всегда используйте #!/usr/bin/env python если у вас нет особых причин не использовать его. Эта форма понимается даже на Windows (Python launcher).

Читайте также:  Windows 10 смартфон 2019

Примечание: установлен скрипты должны использовать определенный исполняемый файл python, например, /usr/bin/python или /home/me/.virtualenvs/project/bin/python . Это плохо, если какой-то инструмент ломается, если вы активируете virtualenv в своей оболочке. К счастью, правильный shebang создан автоматически в большинстве случаев setuptools или ваши инструменты дистрибутива (в Windows, setuptools может генерировать обертки .exe скрипты автоматически).

другими словами, если скрипт находится в исходном чеке, то вы, вероятно, увидите #!/usr/bin/env python . Если он установлен, то shebang-это путь к определенному исполняемому файлу python, например #!/usr/local/bin/python (Примечание: Вы не должны писать пути из последней категории вручную).

, чтобы выбрать, следует ли использовать python , python2 или python3 в притон, см. PEP 394-команда «python» в Unix-подобных системах:

. python должен использоваться в строке shebang только для скриптов, которые источник совместим с Python 2 и 3.

в рамках подготовки к возможному изменению по умолчанию версия Python, Python 2 только скрипты должны быть обновлены, чтобы быть источником совместим с Python 3 или еще использовать python2 в линии shebang.

Если у вас есть несколько версий Python и скрипт должен работать под определенной версией, она-bang может гарантировать, что правильный используется, когда скрипт выполняется напрямую, например:

обратите внимание, что скрипт все еще может быть запущен через полную командную строку Python или через импорт, и в этом случае она-bang игнорируется. Но для скриптов, запускаемых напрямую, это достойная причина использовать she-bang.

#!/usr/bin/env python как правило, лучший подход, но это помогает в особых случаях.

обычно было бы лучше установить виртуальную среду Python, и в этом случае generic #!/usr/bin/env python определит правильный экземпляр Python для virtualenv.

вы должны добавить shebang, если скрипт предназначен для выполнения. Вы также должны установить скрипт с установочным программным обеспечением, которое изменяет shebang на что-то правильное, чтобы он работал на целевой платформе. Примеры этого-distutils и Distribute.

цель shebang заключается в том, чтобы скрипт распознал тип интерпретатора, когда вы хотите выполнить скрипт из оболочки. В основном, и не всегда, вы выполняете сценарии, предоставляя интерпретатор извне. Пример использования: python-x.x script.py

Это будет работать даже если у вас нет Декларатор притон.

почему первый более «портативный», потому что, /usr/bin/env содержит PATH декларация, которая учитывает все пункты назначения, где ваша система исполняемые файлы находятся.

Примечание: Tornado строго не использует shebangs, а Django строго Нет. это зависит от того, как вы выполняете основную функцию вашего приложения.

также: это не зависит от Python.

иногда, если ответ не очень ясен (я имею в виду, что вы не можете решить, да или нет), то это не имеет большого значения, и вы можете игнорировать проблему до тех пор, пока ответ и очистить.

The #! только цель для запуска скрипта. Django загружает источники самостоятельно и использует их. Ему никогда не нужно решать, какой интерпретатор следует использовать. Сюда, в #! на самом деле не имеет смысла здесь.

вообще, если это модуль и не может использоваться в качестве скрипта, нет необходимости использовать #! . С другой стороны, источник модуля часто содержит if __name__ == ‘__main__’: . по крайней мере, с некоторым тривиальным тестированием функциональности. Тогда #! снова имеет смысл.

одна веская причина для использования #! Это когда вы используете оба скрипта Python 2 и Python 3 — они должны интерпретироваться разными версиями Python. Таким образом, вы должны помнить, что python необходимо использовать при запуске скрипта вручную (без #! внутри). Если у вас есть смесь таких скриптов, это хорошая идея, чтобы использовать #! внутри, сделайте их исполняемыми и запустите их как исполняемые файлы (chmod . ).

Читайте также:  Linux what is mounting

при использовании MS-Windows, #! не было смысла — до недавнего времени. Python 3.3 представляет средство запуска Windows Python (py.exe и pyw.exe), который считывает #! строка, обнаруживает установленные версии Python и использует правильную или явно нужную версию Python. Как расширение может быть связано с программа, вы можете получить подобное поведение в Windows, как с execute flag в системах на базе Unix.

когда я недавно установил Python 3.6.1 на Windows 7, он также установил Python Launcher для Windows, который должен обрабатывать линию shebang. Однако я обнаружил, что Python Launcher этого не сделал: строка shebang была проигнорирована, и Python 2.7.13 всегда использовался (если я не выполнил скрипт с помощью py -3).

чтобы исправить это, мне пришлось отредактировать раздел реестра Windows HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command . Это все еще имело значение

из моего предыдущего Python 2.7 установка. Я изменил значение этого раздела реестра на

и обработка линии Shebang запуска Python работала, как описано выше.

using #!/usr/bin/env python3 shebang with Windows

I’m trying to run a Python script from the command line as a command on Windows — so no usage of «Python» or «.py». If my script is named «testing.py», I am attempting to make this name into a command and call «testing» from the command line.

Going through the docs it seems I need to use this shebang #!/usr/bin/env python as long as I have Python in my PATH.

I also have the script folder in my PATH, so something like «testing.py» is currently working from the command line.

I should be able to evoke my Python script just by «testing» if I have the proper paths within PATH and the above shebang. However, I can’t seem to get the script running withouth adding «.py».

4 Answers 4

No, Windows does not support shebang lines.

The documentation you’ve linked relates to the py launcher installed by Python, which can interpret various shebang lines to choose a Python version to run a script with.

setuptools is able to generate wrapper .exes for your Python scripts, but it gets a little involved and already assumes you have a package with a setup.py and so on.

Locally, if you really, really need this, you probably could add .py to the PATHEXT environment variable, so the Windows command line looks up .py s like it looks up .exe s (and various others; the current modern default is .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC ). However, this will naturally not scale for distributing apps, as all of your users would need to set that too.

My recommendation is to stick with just that boring old python testing.py , really.

The accepted answer by @AKX is incorrect for Windows 10 standard Python 3, certainly in the latest Windows 10 (1903) if not earlier.

(Note: I cannot speak to how this may or may not work under WSL.)

I have several versions of Python installed (2.7, 3.6, 3.7, and most recently Python 3.8b1). I’ve been using the #!/usr/bin/env shebang for years in my scripts for cross-platform compatibility (usually to distinguish Py2 vs Py3 scripts).

I’ve created a little script in a folder ( C:\so_test\awtest.py ):

If I run this with awtest.py or just awtest I get 3.6.x reported (showing it’s running with Python 3.6). If I change the shebang to refer to 3.7, I get 3.7.x reported. If I change the shebang to just #!/usr/bin/env python3 I get the latest version of Python installed (3.8).

Now, if I add that folder to my path ( path=%PATH%;C:\so_test in the command window you’re testing in, or in the main env vars (you will need to restart the command window if you do the latter though)), I can change to a different directory and run awtest or awtest.py and they still work and refer to the folder in the path. If I remove the script folder from the path these files are no longer found.

Читайте также:  Операционных систем семейства windows презентация

While I wouldn’t necessarily expect this to work on Windows prior to 10 or Python 2.7, this functionality appears to be the way of things going forward.

Python Shebangs on Windows

Cover image By Sven [Public domain], from Wikimedia Commons

Shebang Lines in the Wild

In Unix-like systems, if you want a file to be executable, you can add a line to the top called a «shebang». They look like this:

Exit fullscreen mode

«Shebang» is short for «hash bang,» which is slang for the pound/hash/octothorpe symbol ( # ), followed by the exclamation point/bang ( ! ). This line is responsible for telling the computer where the program or command that will be used to run this file lives.

Once your file has a shebang, you can make the file executable by adding «execute permissions,» accomplished by running the following command in your Bash shell:

Exit fullscreen mode

You can then run the program by executing it directly:

Exit fullscreen mode

How it Works on Windows

If you’re not using Windows Subsystem Linux or some other form of porting Bash to Windows, you’re probably using PowerShell as your shell of choice. And, I’ve never had very good luck with shebangs working on Windows. I think it is because of the way Windows handles which programs deal with which file suffixes. However, starting with Python 3.3, Python for Windows has shipped with a «Python for Windows Launcher», called from the command line as simply py .

You can launch your latest version of Python by running it with no arguments:

Exit fullscreen mode

You can select which version you’d like by specifying a version flag.

Exit fullscreen mode

If you can’t find it or the command isn’t working, the launcher lives by default in C:\WINDOWS\py.exe . Make sure C:\WINDOWS is on your path and Python files use this executable as their default program.

This is really important. If your default program for running Python files is set to a specific Python executable instead, you’ll end up with some weird and hard-to-diagnose issues. So, to ensure that you’re set up right, run the «Default Programs» application and make sure Python files are associated with the C:\WINDOWS\py.exe executable and not something else.

The nice thing about this launcher is that, if it is the default program to run your Python files, it can process several common forms of shebangs.

Exit fullscreen mode

If you’re hoping to make your scripts portable, use one of the ones beginning with /usr . If py encounters any of these, it will use your default Python. If you specify a version (either major or major.minor), it will use that version instead:

Exit fullscreen mode

In addition, if you use this /usr/bin/env python version (as opposed to the /usr/bin/python or /usr/local/bin/python ), py will do the additional, expected search down your PATH for a python command, the same way it would on a Unix-like system.

There aren’t really «execute permissions» on Windows (correct me if I’m wrong), but once you have one of these lines at the top of your script, you can run it just like an executable in your shell.

Exit fullscreen mode

Exit fullscreen mode

Just one more thing to make you a little less homesick for your Bash shell when you’re on Windows.

There is a lot more information about working with Python on Windows in the Python docs. I recommend you take a look if you’re on windows and you like to find ways to make your life easier.

Thanks for reading!

Discussion (1)

There is an equivalent to exec permissions in Windows, and that is PATHEXT . See Enabling Easy Zipapp Installs on Windows on how to use it with Python zipapps.

Оцените статью