Python - adicionar PYTHONPATH durante a execução do módulo de linha de comando


86

Eu quero correr:

python somescript.py somecommand

Mas, ao executar isso, preciso PYTHONPATHincluir um determinado diretório. Não posso simplesmente adicioná-lo às minhas variáveis ​​de ambiente porque o diretório que desejo adicionar muda com base no projeto que estou executando. Existe uma maneira de alterar PYTHONPATHdurante a execução de um script? Nota: Eu nem mesmo tenho uma PYTHONPATHvariável, então não preciso me preocupar em anexar a ela em vez de substituí-la durante a execução deste script.

Respostas:


148

Para Mac / Linux;

PYTHONPATH=/foo/bar/baz python somescript.py somecommand

Para Windows, configure um wrapper pythonpath.bat;

@ECHO OFF
setlocal
set PYTHONPATH=%1
python %2 %3
endlocal

e chamar pythonpath.batarquivo de script como;

pythonpath.bat /foo/bar/baz somescript.py somecommand

@ İsmail - obrigado. No entanto, como posso fazer isso durante a execução de um script em meu prompt de comando? Não estou executando Python, importando coisas e executando-o manualmente.
orokusaki

No Mac / Linux, você fariaPYTHONPATH=/foo/bar python somescript.py somecommand
ismail

Tentei python -c"import sys;sys.path.append('/my/dir')"e então python myscript.py mycommand, mas obviamente não compartilha o caminho da primeira sessão do intérprete com a próxima. Ah, acabei de ver seu próximo comentário, tentando agora ... Não funcionou no WinXP.
orokusaki

1
Não há unsetcomando de variável de ambiente no Windows. Em vez disso, adicione um setlocalapós o inicial echo offe, em seguida, um implícito endlocalocorrerá quando o script .bat terminar (e PYTHONPATHserá restaurado ao seu valor anterior).
martineau

5
No Windows, se desejar anexar um caminho ao existente PYTHONPATH, convém usar set PYTHONPATH=%PYTHONPATH%;%1.
martineau

49
 import sys
 sys.path.append('your certain directory')

Basicamente, sys.path é uma lista com todos os caminhos de pesquisa para módulos Python. Ele é inicializado pelo intérprete. O conteúdo de PYTHONPATH é adicionado automaticamente ao final dessa lista.


10
ou sys.path.insert (0, '/ algum / diretório') para colocá-lo na frente do seu caminho. Isso permite que seu material sobrescreva outras coisas que já podem estar em pythonpath.
sienkiew

Usei essa resposta para executar o uninttest fora do IDE pydev-eclipse.
LAL de

sys.path.append(r'D:\PyCharmProjects\cheese_shoppe')exemplo no Windows.
Bob Stein,

9

Se você estiver executando o comando a partir de um shell compatível com POSIX, por exemplo bash, você pode definir a variável de ambiente assim:

PYTHONPATH="/path/to" python somescript.py somecommand

Se estiver tudo em uma linha, o valor de ambiente PYTHONPATH se aplica apenas a esse comando.

$ echo $PYTHONPATH

$ python -c 'import sys;print("/tmp/pydir" in sys.path)'
False
$ PYTHONPATH=/tmp/pydir python -c 'import sys;print("/tmp/pydir" in sys.path)'
True
$ echo $PYTHONPATH

Exatamente o que eu estava procurando, muito obrigado. Por algum motivo, correr python -c "import sys; sys.path.insert(0,'my/path'); import mymodule"não funcionou.
Luke Davis

0

Você pode tentar isso para executar uma função dentro do seu script

python -c "import sys; sys.path.append('/your/script/path'); import yourscript; yourscript.yourfunction()"

-1

Isto é para janelas:

Por exemplo, tenho uma pasta chamada "mygrapher" na minha área de trabalho. Dentro, há pastas chamadas "cálculo" e "representação gráfica" que contêm arquivos Python que meu arquivo principal "grapherMain.py" precisa. Além disso, "grapherMain.py" é armazenado em "gráficos". Para executar tudo sem mover arquivos, posso fazer um script em lote. Vamos chamar esse arquivo em lote de "rungraph.bat".

@ECHO OFF
setlocal
set PYTHONPATH=%cd%\grapher;%cd%\calculation
python %cd%\grapher\grapherMain.py
endlocal

Este script está localizado em "mygrapher". Para executar as coisas, eu entraria em meu prompt de comando e faria:

>cd Desktop\mygrapher (this navigates into the "mygrapher" folder)
>rungraph.bat (this executes the batch file)

5
e como isso é diferente da resposta de @ İsmail 'cartman' Dönmez?
Alex Okrushko
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.