如何在Python脚本中调用外部命令(就像我在Unix shell或Windows命令提示符下键入它一样)?
我正在使用以下命令启动子进程:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用时杀死:
p.terminate()
Run Code Online (Sandbox Code Playgroud)
要么
p.kill()
Run Code Online (Sandbox Code Playgroud)
该命令在后台继续运行,所以我想知道如何实际终止该进程.
请注意,当我运行命令时:
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
它在发出时会成功终止p.terminate().
我之间是完全糊涂了subprocess.call(),subprocess.Popen(),subprocess.check_call().
哪个是封锁哪个不是?
如果我用我的意思说的是subprocess.Popen()父进程是否等待子进程return/ exit它继续执行之前.
shell=True这些电话怎么影响?
在Windows上,subprocess.Popen.terminate调用win32 TerminalProcess.但是,我看到的行为是我尝试终止的进程的子进程仍在运行.这是为什么?如何确保进程启动的所有子进程都被终止?
我正在尝试从python启动一个完全独立的进程.我不能使用像os.startfile这样简单的东西,因为我需要传递参数.目前我正在使用subprocess.popen,它让我90%的方式.
args = ["some_exe.exe", "some_arg", "another_arg"]
subprocess.Popen(args, creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
使用带有分离创建标志和std*管道的popen会启动一个新进程,该进程在父进程终止后继续存在.这一切都很好.问题是新的'子'进程仍然保留了父进程的幻象句柄.因此,如果我尝试卸载父exe(我的python脚本通过pyinstaller捆绑到exe),msiexec抱怨父exe仍在使用中.
因此,目标是生成一个完全独立的进程来运行"some_exe.exe",它没有任何句柄回原始进程.
注意:这适用于Windows XP及更高版本.我正在开发Win7.
我需要在Python中使用它自己的专用TTY在一个单独的进程中运行一个交互式Bash实例(我不能使用pexpect).我使用了这个通常在类似程序中使用过的代码片段:
master, slave = pty.openpty()
p = subprocess.Popen(["/bin/bash", "-i"], stdin=slave, stdout=slave, stderr=slave)
os.close(slave)
x = os.read(master, 1026)
print x
subprocess.Popen.kill(p)
os.close(master)
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我得到以下输出:
$ ./pty_try.py
bash: cannot set terminal process group (10790): Inappropriate ioctl for device
bash: no job control in this shell
Run Code Online (Sandbox Code Playgroud)
运行的Strace显示一些错误:
...
readlink("/usr/bin/python2.7", 0x7ffc8db02510, 4096) = -1 EINVAL (Invalid argument)
...
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffc8db03590) = -1 ENOTTY (Inappropriate ioctl for device)
...
readlink("./pty_try.py", 0x7ffc8db00610, 4096) = -1 EINVAL (Invalid argument)
Run Code Online (Sandbox Code Playgroud)
代码片段看起来很简单,Bash没有得到它需要的东西吗?这可能是什么问题?
我想要:
我玩过subprocess.Popen,os.exec,os.spawn,os.system ......但没有成功.
另一种解释问题的方法:如果有人杀死了myexe.exe(arg0)的"进程树",如何保护myexe.exe(arg1)?
编辑:同样的问题(没有答案)在这里
编辑:以下命令不保证子进程的独立性
subprocess.Popen(["myexe.exe",arg[1]],creationflags = DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP,close_fds = True)
Run Code Online (Sandbox Code Playgroud) 这真是一个非常简单的问题,但我似乎无法找到任何解决方案.
我有一个python脚本,我想启动一个独立的守护进程.我想调用ym python脚本,启动这个系统托盘dameon,在数据库文件上做一些python魔法并退出,让系统托盘守护进程运行.
我试过os.system,subprocess.call,subprocess.Popen,os.execl,但它始终保持我的剧本还活着,直到我关闭系统托盘守护进程.
这听起来应该是一个简单的解决方案,但我无法得到任何工作.
编辑:Windows解决方案:http:os.startfile()
//docs.python.org/library/os.html?highlight = startfile#os.startfile
有时放弃和询问意味着你只是在答案的尖端.
我看到了很多与此相反的问题,我觉得很奇怪,因为我无法阻止我的子进程关闭,但有没有办法调用 subprocess.Popen 并确保它的进程在调用 python 脚本后保持运行退出?
我的代码如下:
dname = os.path.dirname(os.path.abspath(__file__))
script = '{}/visualizerUI.py'.format(dname)
self.proc = subprocess.Popen(['python', script, str(width), str(height), str(pixelSize)], stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
这可以很好地打开进程,但是当我关闭脚本时(无论是因为它完成还是使用 Ctrl+C),它也会关闭 VisualizerUI.py 子进程,但我希望它保持打开状态。或者至少有这个选择。
我缺少什么?
我创建了一个程序,在本地服务器中创建Web体系结构,然后加载必要的浏览器以在localhost上显示html和php页面.
该os.system调用会杀死python进程,但不会杀死其他进程 - 例如,httpd.exe和mysqld.exe
该subprocess调用会终止httpd.exe和mysqld.exe程序,但会继续运行python代码,并且在subprocess调用后不会执行任何代码.
在执行python代码之后,我将如何杀死或隐藏所有必要的进程?
这是我的代码.
os.makedirs(dr + x + '/admin' + '/css')
dobj = open(dr + x + '/admin' + '/css' + '/style.css', 'w')
dobj.close()
del dobj
os.makedirs(dr + x + '/admin' + '/js')
os.makedirs(dr + x + '/admin' + '/img')
################################################################################
## THE OS SYSTEM CALLS CLOSE THE APP BUT OPEN THE PROCESSES
## AND THE SUBPROCESS CALLS CLOSE BOTH PROCESSES AND LEAVES THE …Run Code Online (Sandbox Code Playgroud) python ×10
subprocess ×7
process ×3
windows ×3
kill-process ×2
linux ×2
bash ×1
command ×1
daemon ×1
popen ×1
python-2.7 ×1
python-2.x ×1
python-3.x ×1
shell ×1
terminal ×1
tty ×1