Как запустить скрипт Python, не указывая расширение файла (кросс-платформенное решение)?

Скажем, то, что у нас есть сценарий 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) сообщение.

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

  • возвратите errorcode (errorlevel) возвращенный исходным сценарием
  • это не изменит среду
  • это снова использует ту же консоль (никакие новые окна)
  • не вмешивается в STDOUT, STDIN или STDERR
  • будьте дружелюбны по отношению к Ctrl-C (никакие подсказки)

Я предполагаю, что оптимальное решение состоит в том, чтобы все еще использовать обертку. Пакет не будет работать, собственный исполняемый файл добавил бы большую сложность так, вероятно, обертка записала в самом Python, сделает.

9
задан Community 23 May 2017 в 02:16
поделиться

5 ответов

Пока что я придумал это решение, которое, похоже, работает. Создайте файл 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)
2
ответ дан 3 November 2019 в 00:00
поделиться

В Windows я добавил расширение '.py' к переменной среды 'PATHEXT', и это работает для меня - если файл .py хранится в каталог, который является частью переменной среды PATH.

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.PY;.JS;.JSE
5
ответ дан 3 November 2019 в 00:00
поделиться

вы всегда можете вызвать свой скрипт с помощью интерпретатора Python. Вы получаете такую ​​же согласованность в * nix, когда используете интерпретатор.

Windows

c:\> python c:\path\to\myscript 

* nix

$ python /path/to/myscript

Если это не то, что вы хотите, то я неправильно интерпретирую ваш вопрос.

0
ответ дан 3 November 2019 в 00:00
поделиться

Вы можете использовать distutils для установки скриптов в установку Python (например, так устанавливается инструмент easy_install).

Для Windows вы можете использовать py2exe для создания скрипта, который может быть выполнен без расширения файла. В Linux вы можете просто использовать файл без расширения, но включающий строку shebang.

1
ответ дан 3 November 2019 в 00:00
поделиться

Напишите основной модуль Python с расширением .py. Настройте PATHEXT правильно, и он будет работать в Windows без необходимости вводить расширение.

В Unix напишите вторую программу на Python, которая просто импортирует первую, используя синтаксис she-bang. У этого файла нет расширения - это сценарий оболочки. Вот так:

#!/usr/bin/env python
import do

Это приведет к импорту do.py.

Только do необходимо пометить как исполняемый для Unix. do.py — это модуль в этой среде.

При импорте модуля код в модуле запускается один раз.

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

4
ответ дан 3 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: