Tenho um diretório cheio de scripts (digamos project/bin
). Também tenho uma biblioteca localizada em project/lib
e desejo que os scripts a carreguem automaticamente. Isso é o que eu normalmente uso no início de cada script:
#!/usr/bin/python
from os.path import dirname, realpath, sep, pardir
import sys
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib")
# ... now the real code
import mylib
Isso é meio complicado, feio e deve ser colado no início de cada arquivo. Existe uma maneira melhor de fazer isso?
Realmente, o que espero é algo tão suave quanto isto:
#!/usr/bin/python
import sys.path
from os.path import pardir, sep
sys.path.append_relative(pardir + sep + "lib")
import mylib
Ou, melhor ainda, algo que não quebraria quando meu editor (ou outra pessoa que tenha acesso de commit) decida reordenar as importações como parte de seu processo de limpeza:
#!/usr/bin/python --relpath_append ../lib
import mylib
Isso não portaria diretamente para plataformas não-posix, mas manteria as coisas limpas.
python
python-import
James Harr
fonte
fonte
Respostas:
Se você não quiser editar cada arquivo
ou
PYTHONPATH
para o seulib
ou se você deseja adicionar uma única linha a cada arquivo, adicione uma declaração de importação no topo, por exemplo
manter
import_my_lib.py
no lixo eimport_my_lib
pode definir corretamente o caminho python para o quelib
você quiserfonte
Isso é o que eu uso:
fonte
__file__
for um nome de arquivo relativo ao diretório de trabalho atual (por exemplo,setup.py
),os.path.dirname(__file__)
será a string vazia. Por esta e preocupações semelhantes levantada por John Jiang , ekhumoro é mais solução de propósito geral é fortemente preferível.Estou a usar:
fonte
sys.path.append('.')
__file__
vez disso, basta fazer referência como qualquer desenvolvedor quase são.Crie um módulo de wrapper
project/bin/lib
, que contém este:Em seguida, você pode substituir todo o conteúdo cruft na parte superior de seus scripts por:
fonte
Se você não quiser alterar o conteúdo do script de nenhuma forma, inclua o prefixo do diretório de trabalho atual
.
em $ PYTHONPATH (veja o exemplo abaixo)E chamá-lo um dia!
fonte
Usando python 3.4+ Barrando
o uso de cx_freeze ou em IDLE. 😃
fonte
Você pode executar o script a
python -m
partir do diretório raiz relevante. E passe o "caminho dos módulos" como argumento.Exemplo:
$ python -m module.sub_module.main # Notice there is no '.py' at the end.
Outro exemplo:
fonte
Há um problema com cada resposta fornecida que pode ser resumido como "apenas adicione este encantamento mágico ao início do seu script. Veja o que você pode fazer com apenas uma linha ou duas de código." Eles não funcionarão em todas as situações possíveis!
Por exemplo, um desses encantamentos mágicos usa arquivo . Infelizmente, se você empacotar seu script usando cx_Freeze ou estiver usando IDLE, isso resultará em uma exceção.
Outro encantamento mágico usa os.getcwd (). Isso só funcionará se você estiver executando o script a partir do prompt de comando e o diretório que contém o script for o diretório de trabalho atual (ou seja, você usou o comando cd para mudar para o diretório antes de executar o script). Eh deuses! Espero não ter que explicar por que isso não funcionará se o seu script Python está no PATH em algum lugar e você o executou simplesmente digitando o nome do seu arquivo de script.
Felizmente, existe um encantamento mágico que funcionará em todos os casos que testei. Infelizmente, o encantamento mágico é mais do que apenas uma ou duas linhas de código.
Como você pode ver, não é uma tarefa fácil!
fonte
Este funciona melhor para mim. Usar:
No mac, deve imprimir algo como:
Para obter o caminho do abs para o wd atual, este é melhor porque agora você pode subir se quiser, assim:
E agora:
Então, se você quiser importar
utils
daqui,'/Users/<your username>/'
tudo o que você precisa fazer é:
fonte
Eu vejo um shebang em seu exemplo. Se você estiver executando seus scripts bin
./bin/foo.py
, em vez depython ./bin/foo.py
, há uma opção de usar o shebang para alterar a$PYTHONPATH
variável.No entanto, você não pode alterar as variáveis de ambiente diretamente em shebangs, então você precisará de um pequeno script auxiliar. Coloque
python.sh
em suabin
pasta:E então mude a essência do seu
./bin/foo.py
para ser#!bin/python.sh
fonte
Quando tentamos executar o arquivo python com o caminho do terminal.
Salve o arquivo (test.py).
Sistema de execução.
Abra o terminal e vá para aquele diretório onde está o arquivo de salvamento. então escreva
Pressione Enter
Resultado:
fonte