2011-12-15 25 views
8

Tengo un pequeño programa en python que consiste en un archivo .py más un directorio de archivos de datos utilizados por el programa.Script de instalación adecuado para un pequeño programa de Python (No módulo) en Linux

Me gustaría saber la forma correcta de crear un procedimiento de instalación para un usuario con derechos de administrador en Linux para que pueda instalar el programa en su sistema y usarlo desde la línea de comandos, con opciones y parámetros. EDITAR: La parte con la que estoy teniendo problemas es hacer que el programa, una vez instalado, recupere los archivos de datos, contenidos en una subcarpeta de 'datos'.

¿Sería aceptable una solución de instalación que instala el archivo de programa ejecutable en /usr/local/bin y la carpeta de datos en /usr/share/my_program/data? Algo así como:

#!/bin/bash 
# Launch with sudo 
chmod +x program.py 
cp program.py /usr/local/bin 
cp -r data /usr/share/my_program 
echo Installation complete 

Ahora, con el fin de hacer eso, tengo que asumir, en el programa, que los archivos de datos se van a estar en /usr/share/my_program/data. Pero también dejaría al usuario la opción de usar el programa sin instalarlo. Entonces tendría que asumir que los datos están en './data', relativos al archivo de programa ejecutable. ¿Cómo debo resolver este problema? Puedo pensar en algunas maneras, pero mi sensación es que estoy creando un desastre donde debería haber una respuesta clara y correcta.

Actualmente, estoy pensando en utilizar una oportunidad cláusula except:

try: 
    find data from /usr/share/my_program && set path accordingly 
except: 
    set path to the data as './data' 

Una vez más, creo que es un poco complicado. ¿Cómo procederías para la instalación?

Muchas gracias


EDIT: solución adoptada

Sobre la base de las respuestas de esta pregunta, y para los de la pregunta sugerida por FakeRainBrigand (How to know the path of the running script in Python?), he creado un script de instalación que dice así:

#!/bin/bash 
mkdir /usr/share/my_program 
chmod +x my_program.py 
cp my_program.py /usr/local/bin 
cp -r data /usr/share/my_program 
echo Installation completed 

Y agregué el siguiente código en mi programa:

if os.path.dirname(__file__) == "/usr/local/bin": 
    DATA_PATH = "/usr/share/my_program/data" 
elif os.path.dirname(__file__) == ".": 
    DATA_PATH = "./data" 
else: 
    print "You do not have a working installation of my_program" 
    print "See the installation procedure in the README file" 
    sys.exit(1) 

Luego utilizo os.path.join(DATA_PATH, "file-to-reach.txt") para que el programa pueda alcanzarlo de datos, que se encuentran bajo /usr/share/my_program.

Estaría encantado de tener comentarios si un método más aceptado está disponible.

Saludos

+0

'make' es mucho más que solo C, pero puede sentirse fuera de lugar en un programa de Python. – sarnold

Respuesta

11

estoy equivocado que el método setup.py (es decir: pitón setup.py install), es sólo para la instalación de módulos, para después ser utilizado dentro del intérprete o otras secuencias de comandos?

Sí. Te equivocas.

Puede instalar en el directorio de scripts de Python. Siga leyendo sobre todas las cosas que setup.py puede hacer. http://docs.python.org/distutils/setupscript.html#installing-scripts

Esto es realmente muy, muy simple. Y no tiene nada que ver con Python.

Una secuencia de comandos Python se puede ejecutar desde cualquier lugar. Linux le ofrece una amplia y amplia variedad de formas de hacer ejecutable un archivo ejecutable (/path/to/my_program.py).

Todas estas formas amplias y anchas tienen tres cosas en común. Tres cosas que son fundamentales para Linux y no tienen nada que ver con Python en absoluto.

  1. El archivo debe estar en el PATH del usuario.

  2. El archivo debe tener el privilegio "execute" (chmod +x ...).

  3. El archivo debe comenzar con #!/usr/bin/env python.

? ¿Cómo hacer que esto suceda?

Para # 1.

  • Puede verificar la RUTA y poner el archivo en cualquiera de los directorios en la RUTA. Hay muchas opciones estándar para esto. /usr/local/bin, por ejemplo.

  • Puede modificar la RUTA del usuario para incluir algún directorio nuevo. /path/to, por ejemplo, para que se encuentre /path/to/my_program.py.

Para # 2. Ejecuta el chmod +x apropiado.

Para # 3. Usted escribe la línea de código apropiada.

Para más información lee en "Linux Shell". Todos los programas "shell" tienen las mismas tres características. bash. csh, python, perl, etc., etc., etc.


recuperar los archivos de datos, contenidos en una sub-carpeta 'data', mientras refiriéndose a ellos como ./data/this_file.dat, por ejemplo.

Eso sería un diseño pobre.

Linux (fuera de Python) proporciona muchas maneras de encontrar archivos de datos útiles.

  1. Instálelos en una ubicación conocida con una ruta conocida. /usr/local/share me viene a la mente. Esta puede no ser la mejor ubicación, pero es bastante popular.

  2. Usar variables de entorno. MYAPP_HOME, por ejemplo, se puede establecer en la ubicación del archivo. El puede usar os.path.join(os.environ['MYAPP_HOME'], 'data', 'this_file.dat') Muy popular.

  3. Utilice la variable __file__ para averiguar dónde se encuentra su script.A continuación, utilice os.path para localizar el directorio y ensamblar la ruta de datos con os.path.join(this_directory, 'data', 'this_file.dat')

+0

Hola S.Lott Gracias por tu consejo. Soy consciente de los tres pasos que mencionas (ruta, bit ejecutable y shebang!). Sin embargo, utilizando este conocimiento, no puedo hacer que el programa funcione, sabiendo que debe usar algunos de los archivos en la subcarpeta 'datos'. Como actualmente no sé dónde colocará el programa el usuario, no puedo 'codificar' la ruta de acceso de la carpeta al código (lo que en cualquier caso es una muy mala idea). Estoy buscando un proceso de instalación que haga que el archivo de programa se encuentre en la ruta Y permita señalar los datos como: './data/this_file.dat'. ¿Cómo debo proceder? – Morlock

+0

@Morlock: "Como actualmente no sé dónde colocará el programa el usuario". Eso sería un error de tu parte. Dado que esa es su pregunta ** real **, ** actualice ** la pregunta para incluir una descripción de su problema ** real **. Además, mira la documentación de Python un poco más. Toda la información que desea está realmente disponible. La variable global '__file__' por ejemplo, proporcionará mucha información. –

+0

Pregunta actualizada. Creo que la verdadera pregunta está surgiendo como resultado del diálogo con usted y FakeRainBrigand. Gracias por tu actualización. Creo que tengo todas las opciones que necesito ahora y leeré más sobre las avenidas que sugirió. – Morlock

2

Si no tiene dependencias externas, tales como bases de datos o parámetros que se deben configurar, un simple script setup.sh debe hacer.

DIR=`pwd` 
NAME=my_app.py 
echo "#!/usr/bin/env sh 
python $DIR/my_app.py" > /usr/sbin/$NAME 
chmod a+x /usr/sbin/$NAME 

Puede ser más complicado dependiendo de sus necesidades.

+0

Veo la lógica, pero ¿cómo me permitirá usar los archivos necesarios para mi archivo de programa (en la carpeta program_folder/data)? Pondría el ejecutable en/usr/local/bin, pero ¿qué pasa con la carpeta 'data'? Gracias. – Morlock

+0

¿Tal vez haya un directorio reservado para los datos donde podría colocar los archivos de datos y esperar que estén allí?/usr/share/my_program? ¿Es una buena práctica hacer eso y luego codificar la ubicación de estos archivos en mi script, que estaría en/usr/local/bin? Esto suena demasiado simple para ser verdad :) Mi preocupación es aprender de una manera apropiada de hacer esto para mis programas futuros. – Morlock

+0

@Morlock, realmente no hay lugar * correcto * para ponerlos. Es perfectamente aceptable dejarlos donde el usuario los pone. La [respuesta aquí] podría ayudarlo a acceder a su carpeta de datos. – FakeRainBrigand

0

Puede crear un archivo zip ejecutable que contenga su secuencia de comandos y los archivos de datos que utiliza. Una instalación solo necesita poner este archivo en algún lugar en $PATH y hacerlo ejecutable: chmod +x my-program.

python: can executable zip files include data files?

Si crea una adecuada setup.py que especifica cómo instalar los archivos de datos y la secuencia de comandos a continuación, hay muchas más opciones para instalar el programa, por ejemplo,

$ pip install --user http://example.com/your-program.tar.gz 

donde pip se puede instalar a través de un empaquetador de sistema, your-program.tar.gz puede crear usando python setup.py sdist.

Cuestiones relacionadas