Como posso usar um script Python na linha de comando sem fazer o cd no diretório? É o PITONONA?

157

Como posso fazer uso do PYTHONPATH? Quando tento executar um script no caminho, o arquivo não é encontrado. Quando eu cd para o diretório que contém o script, o script é executado. Então, o que é bom o PITONONA?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

Após o cd no diretório do arquivo, ele é executado.

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

Por que não posso fazer uso do PYTHONPATH?

Randy Skretka
fonte
1
Podemos mudar o título deste post? Na verdade, não está pedindo uma explicação para PYTHONPATH.
Nico Cernek 18/10/19
Editado título, porque esta é a primeira coisa que aparece quando googlingPYTHONPATH
raphael

Respostas:

194

Eu acho que você está um pouco confuso. PYTHONPATH define o caminho de pesquisa para importar módulos python, não para executá-los como você está tentando.

PYTHONPATH Aumenta o caminho de pesquisa padrão para arquivos de módulo. O formato é o mesmo que PATH do shell: um ou mais nomes de caminho de diretório separados por os.pathsep (por exemplo, dois pontos no Unix ou ponto e vírgula no Windows). Diretórios inexistentes são ignorados silenciosamente.

Além dos diretórios normais, as entradas individuais do PYTHONPATH podem se referir a arquivos zip que contêm módulos Python puros (na forma de origem ou compilada). Os módulos de extensão não podem ser importados de arquivos zip.

O caminho de pesquisa padrão depende da instalação, mas geralmente começa com o prefixo / lib / pythonversion (consulte PYTHONHOME acima). É sempre anexado ao PYTHONPATH.

Um diretório adicional será inserido no caminho de pesquisa em frente ao PYTHONPATH, conforme descrito acima em Opções de interface. O caminho de pesquisa pode ser manipulado de dentro de um programa Python como a variável sys.path.

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

O que você está procurando é PATH.

export PATH=$PATH:/home/randy/lib/python 

No entanto, para executar seu script python como um programa, você também precisa definir um shebang para Python na primeira linha. Algo assim deve funcionar:

#!/usr/bin/env python

E conceda privilégios de execução a ele:

chmod +x /home/randy/lib/python/gbmx.py

Então você poderá simplesmente executar gmbx.pyde qualquer lugar.

Pedro Werneck
fonte
2
Obrigado amigo. Eu ainda estou resolvendo isso. Meu script consegue importar meus módulos do meu PYTHONPATH personalizado. E agora eu entendo a diferença: é tudo sobre script vs. módulo; chamada de script de comando x importação de python. Sim, eu vou realmente usarexport PATH=$PATH:/home/etc
Randy Skretka 11/11
57

Você está confundindo PATH e PYTHONPATH. Você precisa fazer isso:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH é usado pelo interpretador python para determinar quais módulos carregar.

PATH é usado pelo shell para determinar quais executáveis ​​executar.

Richard
fonte
38

PYTHONPATHafeta apenas importinstruções, não a pesquisa de arquivos python do intérprete Python de nível superior fornecida como argumentos.

Precisando PYTHONPATHser definido não é uma ótima idéia - como em qualquer coisa dependente de variáveis ​​de ambiente, é complicado replicar as coisas de maneira consistente em diferentes máquinas. Melhor é usar 'pacotes' do Python que podem ser instalados (usando 'pip' ou distutils) em caminhos dependentes do sistema que o Python já conhece.

Leia https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 'O Guia do Mochileiro das Embalagens' e também http://docs.python.org/3/tutorial /modules.html - o que explica PYTHONPATH e pacotes em um nível inferior.

estrutura codificada
fonte
Ponto tomado. Nesse caso em particular, adicionar ao PYTHONPATH parece funcionar bem. Como um usuário em uma máquina, posso usar e reutilizar alguns códigos .py já escritos.
Randy Skretka
1
Sinceramente, não acho que instalar coisas em caminhos dependentes do sistema, com acesso root necessário, seja uma ideia melhor do que usar PYTHONPATH. Não conto mais quantas vezes tive que lidar com um programa Python rudimentar que insistia na pip installcoisa em que eu era um usuário comum em um host, não apenas sem acesso root (sei que o pip pode fazer a instalação local), mas também sem pip. Aqui está um conselho para todos que distribuem o software Python - tente instalar seu próprio software em um host Linux baunilha, onde você não tem acesso root e somente a distribuição principal do Python sem pip, primeiro.
quer
3

Eu acho que você está confuso entre PATH e PYTHONPATH. Tudo o que você precisa fazer para executar um 'script' é ter o diretório parental anexado à sua variável PATH. Você pode testar isso executando

which myscript.py

Além disso, se myscripy.pydepender de módulos personalizados, seus diretórios parentais também deverão ser adicionados à variável PYTHONPATH. Infelizmente, como os projetistas de python usavam claramente as drogas, testar suas importações na substituição com o seguinte não garante que seu PYTHONPATH esteja configurado corretamente para uso em um script. Essa parte da programação em python é mágica e não pode ser respondida adequadamente no stackoverflow.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule
W4t3randWind
fonte
3

Com PYTHONPATH definido como no seu exemplo, você poderá fazer

python -m gmbx

-mA opção fará com que o Python pesquise seu módulo em caminhos. O Python geralmente pesquisa módulos, incluindo o que você adicionou ao PYTHONPATH. Quando você executa um interpretador python gmbx.py, ele procura um arquivo específico e o PYTHONPATH não se aplica.

Tigran Saluev
fonte