Articles of 子

subprocess库不会执行compgen

我正在尝试在我的linux(Lubuntu)机器上列出所有可用的命令。 我想在Python中进一步处理这个列表。 通常要在控制台中列出命令,我会写“compgen -c”,它会将结果打印到标准输出。 我想执行该命令使用Pythonsubprocess库,但它给了我一个错误,我不知道为什么。 这里是代码: #!/usr/bin/python import subprocess #get list of available linux commands l_commands = subprocess.Popen(['compgen', '-c']) print l_commands 这是我得到的错误: Traceback (most recent call last): File "commands.py", line 6, in <module> l_commands = subprocess.Popen(['compgen', '-c']) File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child raise child_exception OSError: [Errno […]

将SIGINT信号委派给subprocess,然后清理并终止父进程

我有一个主python(testmain.py)脚本,使用subprocess.Popen命令执行另一个python脚本(test.py)。 当我按下Ctrl-C时,我希望孩子退出退出代码2,然后父母显示退出代码,然后终止。 我有父和子脚本中的信号处理程序。 testmain.py def signal_handler(signal, frame): print "outer signal handler" exit(2) signal.signal(signal.SIGINT, signal_handler) def execute() proc=subprocess.Popen("python test.py",shell=True) streamdata=proc.communicate()[0] rc=proc.returncode print "return code:",rc execute() test.py def signal_handler(signal, frame): print "exiting: inner function" exit(2) signal.signal(signal.SIGINT, signal_handler) 我检查委托信号处理到Python中的一个subprocess是有点类似于我的问题,但在这种情况下,父母继续它的执行,我不想要的。 我想要:1.退出test.py退出(2)2.print退出代码在testmain.py 3.退出test.py退出(2) 有人可以提供build议吗? 谢谢。 更新:处理信号只在子(test.py)和检查父母(testmain.py)中的返回代码将做我想要的。 if rc==2: print "child was terminated" exit(2) 但我想知道是否有一个干净的方式来做到这一点使用信号处理。

Popen命令链接返回0而不是1

所以我在Python中有点新鲜感。 我正在做一个login表单,将你redirect到一个运行在linux服务器上的python脚本来authentication用户。 我一次使用多个命令来查看用户是否在数据库中。 该命令是echo“$ password”| login-p -h 192.0 .. $ user> / dev / null 2>&1当我echo $? 它应该返回一个0,如果它在数据库中,或者1,如果它不是。 在python脚本中,我有这样的: import cgi,shlex,subprocess form = cgi.FieldStorage() params={} for key in form.keys(): params[key]= form[key].value user_name_variable=params['id'] password_variable=params['pwd'] command1="login -p -h 192.0. "+user_name_variable+" >/dev/null 2>&1" command2="echo "+password_variable command3="'echo $?'" p1=subprocess.Popen(shlex.split(command2),shell=True,stdout=subprocess.PIPE) p2=subprocess.Popen(shlex.split(command1),shell=True,stdin=p1.stdout, stdout=subprocess.PIPE) p3=subprocess.Popen(shlex.split(command3),shell=True, stdin=p2.stdout, stdout=subprocess.PIPE) p1.stdout.close() p2.stdout.close() out, err= p3.communicate()[0] […]

不要关注Pythonsubprocess,linux

我正在一个控制台中运行一个脚本来帮助我完成一个重复的任务。 我想在图库中打开图像,并从图像中写下数字。 feh = subprocess.Popen(['feh', 'tmp.jpg']) print ("Input number from image:") number = input() feh.kill() 这段代码可以工作,但是窗口pipe理员仍然关注feh ,这增加了重新调整控制台窗口的一个额外步骤。 有一个额外的论据,我可以通过防止这种行为或其他方式?

如何创build一个私人域名?

为了debugging网站项目的一些function,我想知道是否有可能在我的本地主机访问我的http://127.0.0.1/projectName/test1/public文件夹与自定义域名和创build其他子域? 我在Windows7上使用easyPHP。

如何在Python中重用Popen的中间结果?

代码是这样的: from subprocess import Popen, PIPE p1 = Popen("command1", stdout = PIPE) p2 = Popen("command2", stdin = p1.stdout, stdout = PIPE) result_a = p2.communicate()[0] p1_again = Popen("command1", stdout = PIPE) p3 = Popen("command3", stdin = p1_again.stdout, stdout = PIPE) result_b = p3.communicate()[0] with open("test") as tf: p1_again_again = Popen("command1", stdout = tf) p1_again_again.communicate() 不好的部分是: command1被执行了三次,因为当我使用commnnicate一次时,那个commnnicate对象的stdout不能被再次使用。 […]

应用程序终止,多个嵌套的subprocess

我有一个python应用程序(并行)产生subprocess(主要是bash脚本)。 一些脚本可能会调用其他脚本。 我试图找出最好的方法来处理应用程序和subprocess的终止边界情况。 如果应用程序需要退出或收到一个SIGTERM ,那么它应该终止( SIGTERM , wait , SIGKILL )所有的subprocess和它们创build的进程。 一个方法是开始一个新的进程组,杀死进程组作为终止( killpg )的一部分。 如果任何subprocess比指定的时间更长,我想杀死它们以及它们创build的subprocess。 这里的一个方法是将应用程序设置为一个进程组领导,这样我就可以杀死这个组,并依靠它来杀死其他的subprocess。 困难的是这两个解决scheme相互冲突,所以我似乎只能满足一个要求。 所以,最后的想法是使用tcsetpgrp,但我不太熟悉它。 所以,像模拟一个交互式terminal。 这意味着杀死应用程序会向所有进程发送一个SIGHUP (我认为),并且我可以使用进程组来pipe理耗时过长的subprocess。 这是一个好主意,还是有其他的build议,我失踪了? 奖金部分:如果应用程序是通过SIGKILL杀死的(在这个应用程序中偶尔需要,是的,我知道SIGKILL应该避免,等等…),这将是惊人的,有杀死subprocess以及相同的方式bash退出时向其进程发送一个SIGHUP 。

我怎样才能启动一个进程,并把它放到Python的背景?

我目前正在编写我的第一个Python程序(在Python 2.6.6中)。 该程序便于启动和停止运行在提供用户常用命令的服务器上的不同应用程序(例如在Linux服务器上启动和停止系统服务)。 我正在启动应用程序的启动脚本 p = subprocess.Popen(startCommand, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = p.communicate() print(output) 问题是,一个应用程序的启动脚本停留在前台,所以p.communicate()永远等待。 我已经尝试在startCommand前面使用“nohup startCommand&”,但没有像预期的那样工作。 作为一种解决方法,我现在使用下面的bash脚本来调用应用程序的启动脚本: #!/bin/bash LOGFILE="/opt/scripts/bin/logs/SomeServerApplicationStart.log" nohup /opt/someDir/startSomeServerApplication.sh >${LOGFILE} 2>&1 & STARTUPOK=$(tail -1 ${LOGFILE} | grep "Server started in RUNNING mode" | wc -l) COUNTER=0 while [ $STARTUPOK -ne 1 ] && [ $COUNTER -lt 100 ]; do STARTUPOK=$(tail -1 […]

如何限制python中的subprocessstdout和stderr的大小

我需要运行用户提交的应用程序。 我的代码如下所示: def run_app(app_path): inp = open("app.in", "r") otp = open("app.out", "w") return subprocess.call(app_path, stdout=otp, stdin=inp) 现在,由于我无法控制用户将要提交的内容,我想限制应用程序输出的大小。 其他的事情,如尝试访问未经授权的系统资源和滥用CPU周期,正在受到执法规则的限制。 允许运行的最大时间由父进程处理(在python中)。 现在,stream氓应用程序仍然可以尝试通过向stdout写入大量数据来泛滥服务器系统,因为知道stdout正被保存到文件中。 我不想在内核模式下使用AppArmors RLIMIT或stdout / stderr文件。 能够使用标准库从python执行它将是非常好的。 我目前正在考虑创build文件的子类,并在每次写入时检查已经写入了多less数据。 或者创build一个最大长度的内存映射文件。 但我觉得可能有一个更简单的方法来限制文件大小,我还没有看到它。

无法初始化窗口并等待进程在Python 3 + GTK + 3中结束

我对于面向对象编程,Python和GTK + 3很陌生,尽pipe我对程序编程有一定的了解(主要是C)。 我正在尝试构build一个简单的Python + GTK + 3脚本来在Linux下运行pkexec apt-get update 。 我有一个mainWindow类(基于一个Gtk.Window类),它包含一个名为button (基于一个Gtk.Button类)的button对象,它触发一个clicked事件时在mainWindow定义的new_update_window()方法; new_update_window()方法从一个updateWindow类(基于一个Gtk.Window类)初始化一个updateWindow对象,该类包含一个名为label的标签对象(基于一个Gtk.Label类),并调用Gtk.Label show_all()和update()在updateWindow ; update()方法应该改变label ,运行pkexec apt-get update并再次更改label 。 问题是无论我做什么,发生下列之一: 如果直接运行subprocess.Popen(["/usr/bin/pkexec", "/usr/bin/apt-get", "update"]) , update.Window显示update.Window ,但label会立即设置为应该设置的值只有在pkexec apt-get update完成执行后才能设置; 如果直接运行subprocess.call(["/usr/bin/pkexec", "/usr/bin/apt-get", "update"]) ,直到pkexec apt-get update执行完成才会显示pkexec apt-get update ; 我尝试import threading ,在updateWindow定义一个单独的run_update()方法,并使用thread = threading.Thread(target=self.run_update) , thread.start() , thread.join()在单独的线程中启动函数。仍然取决于我在run_update() ( run_update() subprocess.call()或run_update()调用哪个方法,上面描述的相关行为performance出来。 文艺青年最爱的 我不知道如何去完成我之后的事情,那就是: 显示updateWindow ( […]