Переименуйте файл скрипта в distutils

У меня есть скрипт на Python, myscript.py, который я хочу установить с помощью distutils:

from distutils.core import setup
setup(..., scripts=['myscript.py'], ...)

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

Есть ли способ сохранить старое имя, myscript.py, но по-прежнему установить файл как myscript?


person pafcu    schedule 05.12.2010    source источник
comment
Как насчет создания символической ссылки myscript -> myscript.py?   -  person Sven Marnach    schedule 05.12.2010


Ответы (3)


Возможно, вы захотите взглянуть на инструменты настройки, которые делают это автоматически; из http://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation :

Упаковка и установка скриптов могут быть немного неудобны с distutils. Во-первых, нет простого способа привести имя файла сценария в соответствие с местными соглашениями как на платформах Windows, так и на платформах POSIX. Во-вторых, вам часто приходится создавать отдельный файл только для «основного» скрипта, когда ваш фактический «основной» — это функция где-то в модуле. И даже в Python 2.4 использование параметра -m работает только для реальных файлов .py, которые не установлены в пакете.

setuptools устраняет все эти проблемы, автоматически генерируя для вас сценарии с правильным расширением, а в Windows он даже создает файл .exe, чтобы пользователям не приходилось изменять свои настройки PATHEXT. Способ использования этой функции заключается в определении «точек входа» в вашем сценарии установки, которые указывают, какую функцию сгенерированный сценарий должен импортировать и запускать. Например, чтобы создать два консольных сценария с именами foo и bar и сценарий GUI с именем baz, вы можете сделать что-то вроде этого:

setup(
    # other arguments here...
    entry_points={
        'console_scripts': [
            'foo = my_package.some_module:main_func',
            'bar = other_module:some_func',
        ],
        'gui_scripts': [
            'baz = my_package_gui:start_func',
        ]
    }
)
person cweiske    schedule 14.12.2011

Вы всегда можете сделать что-то вроде этого (в setup.py):

import os
import shutil

if not os.path.exists('scripts'):
    os.makedirs('scripts')
shutil.copyfile('myscript.py', 'scripts/myscript')

setup(...
    scripts=['scripts/myscript'],
    ...
)
person MFreck    schedule 31.12.2010
comment
Использование подкаталога build может быть лучше, т.е. build/_scripts/myscript - person Martin Tournoij; 03.11.2014

Это самое чистое решение, которое я нашел до сих пор. Ответ MFrecks вызывает проблемы при создании исходного дистрибутива или выполнении команды, отличной от установки.

import distutils.command.install_scripts
import shutil

class my_install(distutils.command.install_scripts.install_scripts):
    def run(self):
        distutils.command.install_scripts.install_scripts.run(self)
        for script in self.get_outputs():
            if script.endswith(".py"):
                shutil.move(script, script[:-3])

setup(..., cmdclass = {"install_scripts": my_install}, ...)
person Fabian Henze    schedule 09.07.2012
comment
Хотя это отлично работает для bdist, это не работает с bdist_rpm. Судя по сообщению, создает INSTALLED_FILES, ищет под старыми именами, выдает ошибки. - person eudoxos; 23.10.2012