O que eu faço na linha de comando:
cat file1 file2 file3 > myfile
O que eu quero fazer com o python:
import subprocess, shlex
my_cmd = 'cat file1 file2 file3 > myfile'
args = shlex.split(my_cmd)
subprocess.call(args) # spits the output in the window i call my python program
python
subprocess
catatemypythoncode
fonte
fonte
os.sendfile()
solução baseada é possível, ver reproduzir o comando cat unix em pythonRespostas:
ATUALIZAÇÃO: os.system não é recomendado, embora ainda esteja disponível no Python 3.
Use
os.system
:Se você realmente deseja usar o subprocesso, aqui está a solução (principalmente retirada da documentação do subprocesso):
OTOH, você pode evitar chamadas de sistema completamente:
fonte
os.system
e pode modelar comos.system
precisão, mas também é mais complexa de se trabalhar.os.system
veio antessubprocess
. O primeiro é uma API legada que o último pretende substituir.os.system()
oushell=True
. Para redirecionar a saída de um subprocesso, use ostdout
parâmetro mostrado na resposta de Ryan Thompson . Embora você não precise de um subprocesso (cat
) no seu caso, você pode concatenar arquivos usando Python puro.No Python 3.5+, para redirecionar a saída, basta passar um identificador de arquivo aberto para o
stdout
argumento parasubprocess.run
:Como outros apontaram, o uso de um comando externo como
cat
para este propósito é completamente estranho.fonte
subprocess.run(my_cmd, stdout=outfile)
que está substituindosubprocess.call(...)
Claro:
fonte
Quando você usa um subprocesso , o processo deve ser eliminado. Este é um exemplo. Se você não encerrar o processo, o arquivo ficará vazio e você não poderá ler nada . Ele pode ser executado no Windows . Não posso ter certeza de que pode executado em Unix.
fonte
for line in .readlines():
,s +=
) eproc.kill()
pode levar à perda de informação em geral (não permitir que o subprocesso de encerrar graciosamente (no Unix) - conteúdo unflushed está perdido ) De qualquer forma, a nota sobre o buffer é mais apropriada como um comentário.shlex.split()
, gotashell=True
, gota>file
, gotaopen()
, etc e usostdout=PIPE
,Timer(1, proc.terminate).start()
;output = proc.communicate()[0]
em vez de. Aqui está um exemplo completo . Mais soluções: Parar de ler a saída do processo em Python sem travar? Nota: não há nenhum requisito na questão de que você precise encerrar o processo filho manualmente - você pode resolver outros problemas, por exemplo, um processo pode se comportar de maneira diferente se seu stdout for um tty, mas estiver fora do tópico.Um caso interessante seria atualizar um arquivo anexando um arquivo semelhante a ele. Assim, não seria necessário criar um novo arquivo no processo. É particularmente útil no caso em que um arquivo grande precisa ser anexado. Aqui está uma possibilidade usando a linha de comando final diretamente do python.
fonte