Como eu digo um script Python (cygwin) para trabalhar em diretórios atuais (ou relativos)?
-
12-09-2019 - |
Pergunta
Eu tenho muitos diretórios com arquivos de texto escritos usando (g) vim, e eu ter escrito um punhado de utilitários que eu acho útil em Python. I começar os utilitários com uma linha pitão libra-bang- / usr / bin / env, a fim de utilizar o Python que é instalado sob cygwin. Gostaria de digitar comandos como este:
% cd ~ / SomeBook
% que pythonUtil
/ usr / local / bin / pythonUtil
% pythonUtil ./infile.txt ./outfile.txt
(ou% pythonUtil someRelPath / infile.txt somePossiblyDifferentRelPath / outfile.txt)
pythonUtil: Encontrado infile.txt; Escrevendo outfile.txt; Feito (ou algo assim, se alguma coisa)
No entanto, os meus programas pythonUtil continuo dizendo a mim que eles não podem encontrar infile.txt. Se eu copiar o utilitário para o diretório de trabalho atual, tudo está bem, mas então eu tenho cópias de meus utilitários dominam o cenário. O que eu deveria estar fazendo?
Yet Another Edit: Para resumir --- o que eu queria era os.path.abspath ( 'filename'). Que retorna o caminho absoluto como uma string, e então todos ambigüidade foi removida.
MAS: se o Python está sendo utilizado é o instalado sob cygwin, então o caminho absoluto será um caminho CYGWIN-relativa, como /home/someUser/someDir/someFile.txt. Entretanto, se o Python foi instalado no Windows (e é aqui que está sendo chamado de um cygwin comando terminal), então o caminho absoluto será o caminho completo do Windows, a partir de 'drive' em baixo, como D: \ cygwin \ home \ SomeUser \ somedir \ somefile.txt.
Moral: Não espere que o cygwin Python para gerar um caminho absoluto Windows completo para um arquivo não raiz em /; é além de seu horizonte de eventos. No entanto, você pode chegar a qualquer arquivo em um sistema de WinXP com o cygwin-python se você especificar o caminho do arquivo usando o "/ cygdrive / DRIVELETTER" convenção leadin.
Observação: Não use '\' s para separadores no caminho WinXP na linha de comando cygwin; usar '/' s e confiar a cobra. Não faço ideia porquê, mas alguns separadores pode ser descartado e o caminho pode ser modificado para incluir níveis extras, como "Documents and Settings \ SomeUser" e outras bobagens do Windows.
Graças aos respondedores para me empurrar na direção certa.
Solução
Olhe para os.getcwd:
Edit: Por caminhos relativos, por favor dê uma olhada no módulo os.path:
Em particular, os.path.join e os.path.normpath. Por exemplo:
import os
print os.path.normpath(os.path.join(os.getcwd(), '../AnotherBook/Chap2.txt'))
Outras dicas
O que acontece quando você digita "ls"? Você vê "infile.txt" listado lá?
os.chdir(my_dir)
ou
os.chdir(os.getcwd())