Pergunta

Estou tentando usar o OS.system () para chamar outro programa que pega um arquivo de entrada e uma saída. O comando que eu uso é ~ 250 caracteres devido aos nomes de pastas longas.

Quando tento chamar o comando, estou recebendo um erro: The input line is too long.

Eu acho que há um 255 character limit (É construído usando uma chamada do sistema C, mas também não consegui encontrar as limitações).

Eu tentei mudar o diretório com os.chdir() Para reduzir os comprimentos da trilha da pasta, mas quando tento usar os.system() com "..\folder\filename" Aparentemente, não pode lidar com nomes de caminhos relativos. Existe alguma maneira de contornar esse limite ou fazê -lo reconhecer caminhos relativos?

Foi útil?

Solução

Você deve usar o módulo de subprocesso. Ver isto Little Doc para como reescrever chamadas de sistema para usar o subprocesso.

Outras dicas

Mesmo é uma boa ideia usar subprocess.Popen(), isso não resolve o problema.

Seu problema não é o limite de 255 caracteres, isso foi verdade no DOS Times, posteriormente aumentou para 2048 para o Windows NT/2000 e aumentou novamente para 8192 para o Windows XP+.

o solução real é alternar um bug muito antigo nas APIs do Windows: _popen () e _wpopen ().

Se você usa citações durante a linha de comando, precisa adicionar o comando inteiro em quotas ou obterá o The input line is too long mensagem de erro.

Todos os sistemas operacionais da Microsoft começando com o Windows XP tinham um limite de 8192 caracteres, que agora é suficiente para qualquer uso decente da linha de comando, mas eles esqueceram de resolver esse bug.

Para superar o bug deles Basta incluir todo o seu comando em cotações duplas, e se você quiser saber mais real o Comentário msdn em _popen ().

Tenha cuidado porque estes funciona:

prog
"prog"
""prog" param"
""prog" "param""

Mas estes não funcionam:

""prog param""

Se você precisar de uma função que adicione as cotações quando forem necessárias, você pode tirar a de http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

Você deveria usar subprocesso em vez de os.system.

O subprocesso tem a vantagem de poder alterar o diretório para você:

import subprocess
my_cwd = r"..\folder\"
my_process = subprocess.Popen(["command name", "option 1", "option 2"], cwd=my_cwd)
my_process.wait() # wait for process to end
if my_process.returncode != 0:
    print "Something went wrong!"

O módulo de subprocesso também contém algumas funções auxiliares se o acima parecer um pouco detalhado.

Supondo que você esteja usando o Windows, a partir das barris, você pode escrever um arquivo .bat do Python e depois os.system() naquilo. É um hack.

Certifique -se de quando você estiver usando '' em suas cordas, eles estão sendo escapados adequadamente.

Python usa o '' como o personagem de fuga, então a string "..\folder\filename" avalia para "..folderfilename" já que um F escapado ainda é um f.

Você provavelmente quer usar

r"..\folder\filename"

ou

"..\\folder\\filename"

Recebi a mesma mensagem, mas era estranho porque o comando não era tão longo (130 caracteres) e costumava funcionar, parou de funcionar um dia. Acabei de fechar a janela de comando e abrir uma nova e funcionou. Eu tenho a janela de comando aberta há muito tempo (talvez meses, é uma máquina virtual remota). Eu acho que é um bug do Windows com um buffer ou algo assim.

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