Já se vão mais de 15 anos desde que a última edição da saudosa revista Micro Sistemas foi publicada. Naquela época pré-internet, os curiosos que tentavam aprender como obrigar o computador a fazer exatamente o que eles queriam – vulgo programar – não tinham outra alternativa a não ser garimpar livros e revistas sobre o assunto. Uma das minhas seções preferidas da Micro Sistemas era a dos jogos one-liner em BASIC e suas variantes. Meu primeiro contato com programação foi justamente a tentativa de copiar aquele emaranhado mágico e incompreensível de letras e números que vinha publicado na revista e tentar fazer aquilo funcionar.
Hoje a informação é muito mais acessível e qualquer um pode aprender praticamente qualquer assunto, sobre qualquer ramo do conhecimento humano, desde que tenha disciplina para se dedicar o suficiente. Uma dentre as milhões de coisas bastante úteis de se aprender é o uso das opções de linha de comando do interpretador Python (finalmente cheguei onde queria!). Com elas é possível realizar vários tipos de tarefas em apenas 1 (uma) linha, direto do shell, sem sequer precisar editar um arquivo de código-fonte.
A opção -c <comando>
Executa o código Python passado como argumento em comando, que pode ser uma ou mais declarações separados por indicadores de nova linha, no caso o ponto-e-vírgula (;). Vale lembrar que, assim como no código Python normal, espaços em branco no começo de cada linha são significativos. Portanto, cuidado.
A opção -m <nome-do-módulo>
Procura no sys.path pelo nome-do-módulo e executa seu conteúdo como o módulo principal (__main__). Como o argumento é o nome de um módulo, você não deve passar a extensão (.py). O nome-do-módulo deveria ser um nome de módulo válido para o Python, mas pode ser que a implementação não force esse comportamento (ex.: pode permitir que você use um nome que contenha hífen).
Exemplos de uso
Com essas duas opções e um pouco de criatividade, é possível fazer coisas como:
Imprimir o caminho de busca por módulos Python formatado
Usando os módulos sys e pprint:
$ python -c 'import sys, pprint; pprint.pprint(sys.path)'
Iniciar um servidor HTTP
Este exemplo cria um servidor HTTP que serve o conteúdo do diretório corrente na porta 8081 usando o módulo SimpleHTTPServer :
$ python -m SimpleHTTPServer 8081
Obter lista dos releases disponíveis de um módulo do PyPI
Usando o módulo xmlrpclib:
$ python -c 'import xmlrpclib; print xmlrpclib.Server("http://pypi.python.org/pypi").package_releases("Django")'
['1.5', '1.4.5', '1.4.4', '1.4.3', '1.3.7', '1.3.6', '1.3.5', '1.2.7', '1.1.4', '1.0.4']
Medir o tempo de execução de um trecho de código
Usando o módulo timeit para descobrir qual implementação é mais rápida:
$ python -m timeit '"-".join(str(n) for n in range(100))' 10000 loops, best of 3: 35.3 usec per loop $ python -m timeit '"-".join([str(n) for n in range(100)])' 10000 loops, best of 3: 30.2 usec per loop
Conhece alguma outra aplicação útil das opções de linha de comando do Python? Compartilhe nos comentários!
Referências
- Python command one liners (Vurt.ru blog)
- Command line and environment (Python v3.3.0 documentation)