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