Pergunta

Can todos os caminhos em um uso programa Python ".." (para o diretório pai) e / (para a separação de componentes do caminho), e ainda o trabalho qualquer que seja a plataforma ?

Por um lado, eu nunca vi tal afirmação na documentação (eu possa ter perdido), e os módulos os e os.path que oferecem facilidades para a manipulação de caminhos de forma agnóstica de plataforma (os.pardir, OS .path.join, ...), o que me permite pensar que eles estão aqui por uma razão.

Por outro lado, você pode ler StackOverflow que "../path/to/file" obras em todas as plataformas ...

Assim, deve os.pardir, os.path.join e amigos sempre ser utilizado, para fins de portabilidade, ou são nomes de caminho Unix sempre seguro (até possíveis problemas de codificação de caracteres)? ou talvez "quase sempre" seguro (ou seja, trabalhando sob Windows, OS X e Linux)?

Foi útil?

Solução

"Quase sempre seguro" é certo. Todas as plataformas que se preocupam provavelmente trabalhar bem hoje e eu não acho que eles vão estar mudando suas convenções qualquer momento em breve.

No entanto Python é muito portátil e funciona em muito mais do que as plataformas habituais. A razão para o módulo os é ajudar a acalmar as coisas que uma plataforma tem exigências diferentes.

Existe uma boa razão para você não usar as funções os?

os.pardir é auto documentando enquanto ".." não é, e os.pardir pode ser mais fácil de pesquisar por

Aqui está alguns documentos de python 1.6 quando Mac ainda era diferente para tudo

rotinas mínimos para Mac, DOS, NT, ou Posix dependendo de qual sistema que estamos por diante.

Este exportações: - todas as funções de posix, nt, DOS, OS2, mac, ou ce, por exemplo Unlink, stat, etc. - os.path é um dos módulos posixpath, ntpath, macpath, ou dospath - os.name é 'posix', 'nt', 'Dos', 'OS2', 'Mac', ou 'ce' - os.curdir é uma string representando o diretório atual (ou ':' '') - os.pardir é uma string representando o diretório pai ( '..' ou '::') - os.sep é o (ou um comum mais) separador de diretórios ( '/' ou ':' ou '\') - os.altsep é o separador de caminho alternativo (Nenhum ou '/') - os.pathsep é o separador componente usado na $ PATH etc - os.linesep é o separador de linha em arquivos de texto ( ' 'ou' 'ou'') - os.defpath é o caminho de pesquisa padrão para executáveis ??

Os programas que de importação e uso 'OS' stand uma melhor chance de ser portáveis ??entre diferentes plataformas. Claro, eles devem então somente funções de uso que são definidas por todas as plataformas (por exemplo, remoção de link e opendir), e deixar toda a manipulação caminho para os.path (por exemplo, divisão e juntar-se).

Outras dicas

Eu nunca tive quaisquer problemas com o uso .., embora possa ser uma boa idéia para convertê-lo para um caminho absoluto usando os.path.abspath . Em segundo lugar, eu recomendaria sempre usando os.path.join onde quer que possível. Há uma série de casos de canto (além de problemas de portabilidade) em juntar-se caminhos, e é bom para não ter de se preocupar com eles. Por exemplo:

>>> '/foo/bar/' + 'qux'
'/foo/bar/qux'
>>> '/foo/bar' + 'qux'
'/foo/barqux'
>>> from os.path import join
>>> join('/foo/bar/', 'qux')
'/foo/bar/qux'
>>> join('/foo/bar', 'qux')
'/foo/bar/qux'

Você pode ter problemas com o uso de .. se você estiver em algumas plataformas obscuros, mas eu não posso nomear qualquer (Windows, * nix, e OS X todo o apoio que notação).

Dentro de python, usando / irá funcionar sempre. Você precisará estar ciente da convenção OS se você quiser executar um comando em um subshell

myprog = "/path/to/my/program"
os.system([myprog, "-n"])                           # 1
os.system([myprog, "C:/input/file/to/myprog"])      # 2

Comando # 1 irá provavelmente funcionar como esperado.
Comando # 2 pode não funcionar se myprog é um comando e espera para analisar seus argumentos de linha de comando para obter um nome de arquivo do Windows do Windows.

Ele funciona em Windows, por isso, se você define "qualquer que seja a plataforma" para ser Unix e Windows, você está bem.

Por outro lado, Python também é executado em VMS, RISC OS, e outras plataformas ímpares que usam completamente diferentes convenções de nomes de arquivos. No entanto, é provável que tentar obter o seu aplicativo seja executado em VMS, cego, é meio bobo de qualquer maneira - "portabilidade prematura é a raiz de alguns relativamente menor mal"

Eu gosto de usar as funções os.path qualquer maneira, porque eles são bons para expressar a intenção -. Em vez de apenas uma concatenação, o que pode ser feito para qualquer um de um milhão de propósitos, ele lê muito explicitamente como uma manipulação caminho

Windows suporta / como um separador de caminho. As únicas incompatibilidades entre nomes de arquivos Unix e nomes de arquivos do Windows são:

  • os caracteres permitidos em nomes de arquivos
  • os nomes especiais e
  • maiúsculas e minúsculas

Windows é mais restritiva do duas contas primeira (este é, ele tem mais personagens e nomes mais especiais proibido), enquanto Unix é tipicamente maiúsculas de minúsculas. Há algumas aqui listar exatamente quais são esses personagens e nomes. Vou ver se posso encontrá-los.

Agora, se o seu ambiente de desenvolvimento vem com uma função para criar ou manipular caminhos, você deve usá-lo, ele está lá por uma razão, sabe. Especialmente tendo em conta que há muito mais plataformas do que o Windows e Unix.

Respondendo a sua primeira pergunta, sim ../dir/file vai funcionar, a não ser que atinjam alguma das situações acima mencionadas incompatibilidades.

OS / X e Linux são ambos Unix compatível, então, por definição, eles usam o formato que você deu no início da questão. Windows permite "/", além de "\" para que os programas poderiam ser intercambiáveis ??com Xenix, uma variante do Unix que a Microsoft estava tentando há muito tempo, e que a compatibilidade foi transportado para o presente. Assim, ele funciona também.

Eu não sei quantas outras plataformas Python foi portado para, e eu não posso falar por eles.

Como já foi dito, uma barra irá funcionar em todos os casos, mas você é melhor criar uma lista de segmentos de caminho e os.path.join (.) - ing-los

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top