[Python] Come scrivere uno script da installare in /usr/bin con setup.py?

Marco Giusti marco.giusti a gmail.com
Sab 19 Mar 2011 17:43:31 CET


On Sat, Mar 19, 2011 at 12:10:10PM +0100, lex mlist wrote:
> Giorno a tutti,
> 
> quello che vorrei ottenere è uno script da eseguire per automatizzare alcuni
> processi.
> Non è conveniente spostare sempre lo script perchè potrebbe essere
> utilizzato in qualsiasi directory, e quindi diverrebbe scomodo.
> Non vorrei dover far settare a mano la variabile d'ambiente in cui ricercare
> lo script.
> 
> Pensavo quindi di affidarmi al setup.py e all'argomento 'scripts' della
> funzione setup.

setup.py, ovvero distutils/setuptools/distribute (c'è un po' di
confusione dietro) ti permette di installare i tuoi script in
determinate cartelle "speciali", ovvero che sono presenti in $PATH,
questo in unix, in windows credo che sia %PATH ma non so' di sicuro.

lo script che vai ad installare deve essere uno script che deve essere
eseguibile o, se non ricordo male, una chiamata ad una funzione. qui[1]
puoi vedere un esempio su come creare uno script eseguibile, mentre
qui[2] puoi vedere come settare setuptools/distribute affiché ti creino
uno script che sia eseguibile e che sia installato nella giusta
directory.

[1] http://www.artima.com/weblogs/viewpost.jsp?thread=4829
[2] http://peak.telecommunity.com/DevCenter/setuptools#automatic-script-creation

[...]
> Ho provato a dare una occhiata al file  generato e ho modificato execfile
> con exec. Ma poi mi viene a dare un errore tipo:

bhé, non puoi pensare di cambiare una chiamata a funzione e pensare che
il programmi funzioni ancora solo perché il nome si assomiglia.

tu in realtà non hai bisogno di simulare il comportamento di
setuptools/ecompagni quando in realtà ci penseranno loro a fare tutto il
lavoro per te, in setup.py:

	setup(
		name='...',
		# ...
		entry_points = {
			'console_scripts': [
				'nome_dell_eseguibile': 'package.some_module:main_func',
			]
		}
	)

dopodiché con il comando _install_ o _develop_ avrai un eseguibile che
sarà invocabile da shell semplicemente chiamandolo:

	$ nome_dell_eseguibile [args...]

> Traceback (most recent call last):
>   File "/Users/lexor/Desktop/test/bin/testdev.py", line 7, in <module>
>     exec(__file__)
>   File "<string>", line 1
>     /Users/lexor/Desktop/test/test/scripts/testdev.py
>     ^
> SyntaxError: invalid syntax

questo semplicemente perché tu dici a python di interpretare
'/Users/...' come un comando, come dire:

	>>> /Users/lexor/Desktop/test/test/scripts/testdev.py
	  File "<stdin>", line 1
		/Users/lexor/Desktop/test/test/scripts/testdev.py
		^
	SyntaxError: invalid syntax
	>>> 

> Avete qualche guida che spiega come creare uno di questi script? Ho guardato
> la doc di distutils ma non spiega come crearli, solo come installarli...
> Meglio se per py3, ma mi accontento anche di una versione vecchissima purchè
> sia applicabile :s

leggiti il post del sign. van Rossum e poi la documentazione di
setuptools o di distribute, meglio, sopratutto il paragrafo che ti ho
indicato.

-- 
Dalle virtù che si esigono in un domestico, l'Eccellenza Vostra conosce molti
padroni degni d'esser servitori?
		-- Pierre Augustin Caron de Beaumarchais


Maggiori informazioni sulla lista Python