2010-12-05 18 views
16

que tengo un script en Python, myscript.py, que deseo realizar la instalación mediante distutils:en distutils

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

preferiría si pudiera llamar al script instalado utilizando sólo myscript en lugar de escribir myscript.py. Esto podría lograrse renombrando el archivo a solo myscript, pero luego muchos editores, etc., ya no entenderían que es un archivo de Python.

¿Hay alguna manera de mantener el nombre antiguo, myscript.py pero aún así instalar el archivo como myscript?

+1

¿Qué le parece crear un enlace simbólico 'myscript -> myscript.py'? –

Respuesta

9

Siempre se puede hacer algo como esto (en 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'], 
    ... 
) 
+1

Usar un subdirectorio de 'compilación' podría ser mejor, es decir. 'build/_scripts/myscript' – Carpetsmoker

11

Es posible que desee mirar a los setuptools que hacen esto automáticamente para usted; de http://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation:

de empaque y de secuencias de comandos de instalación puede ser un poco incómoda con los distutils. Por un lado, no hay una manera fácil de tener el nombre de archivo de un script que coincida con las convenciones locales en las plataformas Windows y POSIX. Por otro lado, a menudo tiene que crear un archivo separado solo para el script "principal" , cuando su "principal" real es una función en un módulo en algún lugar. E incluso en Python 2.4, el uso de la opción -m solo funciona para archivos .py reales que no están instalados en un paquete.

setuptools corrige todos estos problemas mediante la generación automática guiones para usted con la extensión correcta, y en Windows que se incluso crear un archivo .exe para que los usuarios no tienen que cambiar sus ajustes PATHEXT . La forma de usar esta característica es definir "entrada puntos" en su secuencia de comandos de instalación que indique qué función debe generar y ejecutar la secuencia de comandos generada . Por ejemplo, para crear dos consolas guiones llamados foo y bar, y un guión GUI llamada Baz, que podría hacer algo como esto :

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', 
     ] 
    } 
) 
5

Esta es la solución más limpio que he encontrado hasta ahora. La respuesta de MFrecks causa problemas cuando se crea una distribución fuente o se ejecuta un comando que no sea la instalación.

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}, ...) 
+1

Si esto funciona bien para' bdist', se rompe con 'bdist_rpm'. A juzgar por el mensaje, está creando 'INSTALLED_FILES', busca los que están bajo nombres antiguos, y los errores están fuera. – eudoxos

Cuestiones relacionadas