Скажем, то, что у нас есть сценарий Python do.py
и мы хотим смочь назвать его без расширения, как do
или ./do
.
Если мы переименовываем файл от do.py
кому: do
и гарантируйте, что у нас есть допустимая строка хижины, она будет работать на все платформы, но Windows. В Windows нет никакого способа выполнить файл без расширения.
В Windows, если мы сохраняем исходное расширение файла, мы сможем назвать сценарий без полного имени, потому что установщик Python регистрируется .py
расширение как исполняемое.
Выглядит, что мы должны поставить тот же сценарий под двумя различными именами, чтобы быть вызовом это в Windows и средах не-Windows. Мне действительно не нравится это, и я ищу решение без этого дублирования.
Другой общий подход на этом должен добавить a do.cmd
пакетный файл обертки, который называет оригинал do.py
файл. Это имеет по крайней мере одну главную проблему: это действительно повреждает Ctrl+C / Ctrl+Break, потому что нет никакого способа предотвратить cmd.exe
от запроса Вас с Оконечным пакетным заданием? (Y/N) сообщение.
Если мы собираемся использовать обертку, мы должны быть уверены что:
Я предполагаю, что оптимальное решение состоит в том, чтобы все еще использовать обертку. Пакет не будет работать, собственный исполняемый файл добавил бы большую сложность так, вероятно, обертка записала в самом Python, сделает.
Пока что я придумал это решение, которое, похоже, работает. Создайте файл yourname.py
со следующим содержанием:
import os, sys
filename = os.path.splitext(os.path.basename(sys.argv[0]))[0]
if not os.path.exists(filename):
# filename does not exists, we will emulate cmd behaviour
sys.stderr.write("'%s' is not recognized as an internal or external command,\noperable program or batch file." % filename)
sys.exit(9009)
ret = os.system("python %s %s" % (
filename,
" ".join(sys.argv[1:])
))
exit(ret)
В Windows я добавил расширение '.py' к переменной среды 'PATHEXT', и это работает для меня - если файл .py хранится в каталог, который является частью переменной среды PATH.
C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.PY;.JS;.JSE
вы всегда можете вызвать свой скрипт с помощью интерпретатора Python. Вы получаете такую же согласованность в * nix, когда используете интерпретатор.
Windows
c:\> python c:\path\to\myscript
* nix
$ python /path/to/myscript
Если это не то, что вы хотите, то я неправильно интерпретирую ваш вопрос.
Вы можете использовать distutils для установки скриптов в установку Python (например, так устанавливается инструмент easy_install).
Для Windows вы можете использовать py2exe для создания скрипта, который может быть выполнен без расширения файла. В Linux вы можете просто использовать файл без расширения, но включающий строку shebang.
Напишите основной модуль Python с расширением .py
. Настройте PATHEXT
правильно, и он будет работать в Windows без необходимости вводить расширение.
В Unix напишите вторую программу на Python, которая просто импортирует первую, используя синтаксис she-bang. У этого файла нет расширения - это сценарий оболочки. Вот так:
#!/usr/bin/env python
import do
Это приведет к импорту do.py
.
Только do
необходимо пометить как исполняемый для Unix. do.py
— это модуль в этой среде.
При импорте модуля код в модуле запускается один раз.
Это не устраняет избыточность полностью, но близко к этому. И это, вероятно, лучшее решение для кроссплатформенного скриптинга.