在 python 脚本中启动 shell 命令,等待终止并返回到脚本

发布于 2024-07-09 16:43:29 字数 305 浏览 8 评论 0原文

我有一个 python 脚本,必须为目录中的每个文件启动 shell 命令:

import os

files = os.listdir(".")
for f in files:
    os.execlp("myscript", "myscript", f)

这对于第一个文件来说效果很好,但是在“myscript”命令结束后,执行停止并且不会返回到 python 脚本。

我怎样才能做到这一点? 在调用 os.execlp() 之前是否必须fork()

I have a python script that has to launch a shell command for every file in a dir:

import os

files = os.listdir(".")
for f in files:
    os.execlp("myscript", "myscript", f)

This works fine for the first file, but after the "myscript" command has ended, the execution stops and does not come back to the python script.

How can I do this? Do I have to fork() before calling os.execlp()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

薄荷→糖丶微凉 2024-07-16 16:43:29

subprocess:subprocess 模块
允许你产生新的进程,
连接到他们的输入/输出/错误
管道,并获取其返回码。

http://docs.python.org/library/subprocess.html

用法:

import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode

subprocess: The subprocess module
allows you to spawn new processes,
connect to their input/output/error
pipes, and obtain their return codes.

http://docs.python.org/library/subprocess.html

Usage:

import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
第七度阳光i 2024-07-16 16:43:29

您可以使用 subprocess.Popen。 有几种方法可以做到这一点:

import subprocess
cmd = ['/run/myscript', '--arg', 'value']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
    print line
p.wait()
print p.returncode

或者,如果您不关心外部程序实际做什么:

cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()

You can use subprocess.Popen. There's a few ways to do it:

import subprocess
cmd = ['/run/myscript', '--arg', 'value']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
    print line
p.wait()
print p.returncode

Or, if you don't care what the external program actually does:

cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
奢欲 2024-07-16 16:43:29

subprocess 模块自 2008 年以来一直在发展。特别是 check_callcheck_output 使简单的子流程工作变得更加容易。 check_* 系列函数很不错,如果出现问题,它们会引发异常。

import os
import subprocess

files = os.listdir('.')
for f in files:
   subprocess.check_call( [ 'myscript', f ] )

myscript 生成的任何输出都将显示为您的进程生成了输出(从技术上讲,myscript 和您的 python 脚本共享相同的标准输出)。 有几种方法可以避免这种情况。

  • check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
    stdout 将被抑制(如果 myscript 产生超过 4k 的输出,请注意)。 除非您添加选项 stderr=subprocess.PIPE,否则 stderr 仍会显示。
  • check_output([ 'myscript', f ] )
    check_output 将标准输出作为字符串返回,因此不会显示。 除非添加选项 stderr=subprocess.STDOUT,否则仍会显示 stderr。

The subprocess module has come along way since 2008. In particular check_call and check_output make simple subprocess stuff even easier. The check_* family of functions are nice it that they raise an exception if something goes wrong.

import os
import subprocess

files = os.listdir('.')
for f in files:
   subprocess.check_call( [ 'myscript', f ] )

Any output generated by myscript will display as though your process produced the output (technically myscript and your python script share the same stdout). There are a couple of ways to avoid this.

  • check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
    The stdout will be supressed (beware if myscript produces more that 4k of output). stderr will still be shown unless you add the option stderr=subprocess.PIPE.
  • check_output( [ 'myscript', f ] )
    check_output returns the stdout as a string so it isnt shown. stderr is still shown unless you add the option stderr=subprocess.STDOUT.
じее 2024-07-16 16:43:29

os.exec*() 函数将当前程序替换为新程序。 当这个程序结束时,你的进程也会结束。 您可能需要os.system()

The os.exec*() functions replace the current programm with the new one. When this programm ends so does your process. You probably want os.system().

不打扰别人 2024-07-16 16:43:29

使用生成

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')

use spawn

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
原来分手还会想你 2024-07-16 16:43:29

我使用 os.system

import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))

I use os.system

import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
地狱即天堂 2024-07-16 16:43:29

这对我来说很好!

shell_command = “ls -l”
subprocess.call(shell_command.split())

this worked for me fine!

shell_command = "ls -l"
subprocess.call(shell_command.split())

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文