Переименовать файл скрипта в distutils - PullRequest
20 голосов
/ 05 декабря 2010

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 14 декабря 2011

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

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

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

Вы всегда можете сделать что-то вроде этого (в 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'],
    ...
)
6 голосов
/ 09 июля 2012

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