Подтвердить что ты не робот

Переименуйте файл script в distutils

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

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

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

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

4b9b3361

Ответ 1

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

Сценарии упаковки и установки могут быть немного неудобными с помощью Distutils. Во-первых, нет простого способа иметь script s filename соответствует локальным соглашениям на платформах Windows и POSIX. Для другого вам часто приходится создавать отдельный файл только для "main" script, когда ваш фактический "главный" - это функция в модуле где-то. И даже в Python 2.4 использование опции -m работает только для актуальные .py файлы, которые arent установлены в пакете.

setuptools исправляет все эти проблемы, автоматически генерируя скрипты для вас с правильным расширением, а в Windows это будет даже создайте файл .exe, чтобы пользователи не могли изменить их. Настройки PATHEXT. Способ использования этой функции - определить "вход" точек "в вашей настройке script, которые указывают, какая функция сгенерирована script должен импортироваться и запускаться. Например, чтобы создать две консоли скрипты, называемые foo и bar, и GUI script, называемые 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',
        ]
    }
)

Ответ 2

Вы всегда можете сделать что-то подобное (в 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'],
    ...
)

Ответ 3

Это самое чистое решение, которое я нашел до сих пор. Ответ 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}, ...)