Что я делаю в командной строке:
cat file1 file2 file3 > myfile
Что я хочу делать с 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
источник
источник
os.sendfile()
возможно решение на основе, см. Воспроизведение команды unix cat в pythonОтветы:
ОБНОВЛЕНИЕ: os.system не рекомендуется, хотя она все еще доступна в Python 3.
Использование
os.system
:Если вы действительно хотите использовать подпроцесс, вот решение (в основном взято из документации для подпроцесса):
OTOH, вы можете полностью избежать системных вызовов:
источник
os.system
и можетos.system
точно моделировать , но с ней также сложнее работать.os.system
приходил раньшеsubprocess
. Первый - это устаревший API, который второй намеревается заменить.os.system()
илиshell=True
. Чтобы перенаправить вывод подпроцесса, используйтеstdout
параметр, как показано в ответе Райана Томпсона . Хотя вам не нужен subprocess (cat
) в вашем случае, вы можете объединить файлы, используя чистый Python.В Python 3.5+ для перенаправления вывода просто передайте дескриптор открытого файла для
stdout
аргументаsubprocess.run
:Как отмечали другие, использование внешней команды, подобной
cat
этой, совершенно неуместно.источник
subprocess.run(my_cmd, stdout=outfile)
который заменяетsubprocess.call(...)
Конечно:
источник
Когда вы используете подпроцесс , процесс должен быть убит. Это пример. Если вы не убиваете процесс, файл будет пустым и вы ничего не сможете прочитать. Он может работать в Windows. Я не могу убедиться, что он может запустить в Unix.
источник
for line in .readlines():
,s +=
) иproc.kill()
может привести к потере информации в целом (это не позволяет подпроцесс прекратить корректно (на Unix) - промываться содержание теряется ). В любом случае замечание о буферизации уместнее в качестве комментария.shlex.split()
, падениеshell=True
, падение>file
, падениеopen()
и т.д. и использованиеstdout=PIPE
,Timer(1, proc.terminate).start()
;output = proc.communicate()[0]
вместо. Вот полный пример . Другие решения: прекратить чтение вывода процесса в Python без зависания? Примечание: в вопросе нет требования, что вам нужно завершить дочерний процесс вручную - вы можете решить другие проблемы, например, процесс может вести себя иначе, если его стандартный вывод является tty, но не по теме.Один интересный случай - обновить файл, добавив к нему аналогичный файл. Тогда не нужно было бы создавать новый файл в процессе. Это особенно полезно в случае, когда нужно добавить большой файл. Вот одна из возможностей использования командной строки teminal непосредственно из python.
источник