Pergunta

Atualmente estou tendo um grande problema com um script python. O script é executado comandos arbitrários através de um manipulador para converter o relatório de erro incorreta no relatório de erros correta.

O problema que estou tendo é obter o script para trabalho corretamente no Windows com um comando que contém ampersands em seu caminho. Eu tenho tentado citando o comando, escapando e comercial com ^ e nem obras. Agora estou sem ideias. Alguma sugestão?

Para esclarecer a partir das respostas atuais:

  1. Eu estou usando o módulo de subprocesso
  2. eu estou passando a linha de comando + argumentos como uma lista
  3. O problema é com o caminho para o próprio comando, e não qualquer um dos argumentos
  4. Eu tentei citar o comando. Isso faz com que um erro de [Error 123] The filename, directory name, or volume label syntax is incorrect
  5. Eu estou usando nenhum argumento shell (assim shell=false)
  6. No caso importa, eu estou pegando um tubo para stderr para processá-lo, mas ignorando stdout e stdin
  7. É apenas para uso em janelas atualmente, e funciona como esperado em todos os outros casos que eu testei até agora.
  8. O comando que está a falhar é:

p = subprocess.popen (prog, stderr = subprocess.PIPE, bufsize = -1)

quando o primeiro elemento da lista 'prog' contém quaisquer ampersands. Citando esta primeira cadeia não funciona.

Foi útil?

Solução

Certifique-se de que você está usando as listas e nenhuma expansão shell:

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)

Outras dicas

A resposta adequada vai precisar de mais informações do que isso. O que você está realmente fazendo? Como ele falhar? Você está usando o módulo de subprocesso? Você está passando uma lista de argumentos e shell = Falso (ou nenhum argumento shell) ou você está realmente invocar o shell?

Tente citando o argumento que contém o &

wget "http://foo.com/?bar=baz&baz=bar"

É geralmente o que tem que ser feito em um shell Linux

"escapar e comercial com ^"

Você tem certeza ^ é um caractere de escape para o Windows? você não deve usar \?

Para responder a minha própria pergunta:

Citando o comando real ao passar os parâmetros como uma lista não funciona corretamente (comando é primeiro item da lista), de modo a resolver o problema que virou a lista em um espaço separado de cordas e passou isso em subprocess vez.

Melhores soluções ainda bem-vindas.

Eu tento uma situação como a seguir:

exe = 'C:/Program Files (x86)/VideoLAN/VLC/VLC.exe'
url = 'http://translate.google.com/translate_tts?tl=en&q=hello+world'
subprocess.Popen([exe, url.replace("&","^&")],shell=True)

Este funciona.

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