este código é obter os templates / blog1 / page.html em b.py:
path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))
mas eu quero obter a localização do diretório pai:
aParent
|--a
| |---b.py
| |---templates
| |--------blog1
| |-------page.html
|--templates
|--------blog1
|-------page.html
e como obter a localização aParent
obrigado
Atualizada:
isto está certo:
dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))
ou
path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
blog1
oua
? E onde está localizado o seu arquivo atual?os.path.join('templates', 'blog1/page.html')
parece estranho para mim. Você está misturando as coisas. Ouos.path.join('templates', 'blog1', 'page.html')
ou'templates/blog1/page.html'
. E muito mais fácil seriaos.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
entãoRespostas:
Você pode aplicar dirname repetidamente para subir mais alto:
dirname(dirname(file))
. No entanto, isso só pode ir até o pacote raiz. Se este é um problema, useos.path.abspath
:dirname(dirname(abspath(file)))
.fonte
dirname
. Não é óbvio para todos que a aplicação de dirname a um diretório produz o diretório pai.dirname
se não sempre retornar o diretório pai; Twitter.com/#!/ActiveState/status/671049326788608/
como não representando a própria entrada do diretório folha, mas seu conteúdo, e é por isso que, por exemplo,mv xxx yyy/
falha seyyy
não for um diretório preexistente. De qualquer forma, mesmo se considerarmos o seu argumento como um dado, é irrelevante no contexto da minha resposta. Nemfile
o resultado dedirname
jamais terminará em a/
.dirname
pode retornar'/'
, o que claramente termina em a/
. Essa é a única exceção, AFAIK.os.path.abspath
não valida nada, por isso, se já estamos anexando cadeias de caracteres,__file__
não há necessidade de se preocupar com adirname
junção ou nada disso. Apenas trate__file__
como um diretório e comece a subir:Isso é muito menos complicado do que
os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
e tão gerenciável quantodirname(dirname(__file__))
. Subir mais de dois níveis começa a ficar ridículo.Mas, como sabemos quantos níveis subir, poderíamos limpar isso com uma pequena função simples:
fonte
os.path.abspath(os.path.join(__file__, "..", "..")
mais portátil?Use o caminho relativo com o
pathlib
módulo no Python 3.4+:Você pode usar várias chamadas
parent
para ir além no caminho:Como alternativa à especificação
parent
duas vezes, você pode usar:fonte
str(Path(__file__).parent)
.Deve lhe dar o caminho para
a
.Mas se
b.py
é o arquivo que está sendo executado no momento, você pode conseguir o mesmo fazendo apenasfonte
dirname()
duas vezes. Tudo o que você precisa agora deve estar neste site.os.pardir
é uma maneira melhor../
e mais legível.Isso retornará o caminho pai do determinado_caminho
fonte
Uma maneira simples pode ser:
fonte
Pode ser juntar duas
..
pastas, para obter pai da pasta pai?fonte
Use o seguinte para ir para a pasta anterior:
Se você precisar de vários saltos, uma solução boa e fácil será usar um decorador simples neste caso.
fonte
Aqui está outra solução relativamente simples que:
dirname()
(o que não funciona como esperado em argumentos de um nível, como "arquivo.txt" ou pais relativos, como "..")abspath()
(evitando suposições sobre o diretório de trabalho atual), mas preserva o caráter relativo dos caminhosapenas usa
normpath
ejoin
:Resultado:
fonte
Eu acho que usar isso é melhor:
fonte
Eu tentei:
fonte