我正在做一个漂亮的小功能:
def startProcess(name, path):
"""
Starts a process in the background and writes a PID file
returns integer: pid
"""
# Check if the process is already running
status, pid = processStatus(name)
if status == RUNNING:
raise AlreadyStartedError(pid)
# Start process
process = subprocess.Popen(path + ' > /dev/null 2> /dev/null &', shell=True)
# Write PID file
pidfilename = os.path.join(PIDPATH, name + '.pid')
pidfile = open(pidfilename, 'w')
pidfile.write(str(process.pid))
pidfile.close()
return process.pid
问题是那process.pid
不是正确的PID。似乎总是比正确的PID低1。例如,它说该进程始于31729,但是ps
说它正在31730运行。每次我尝试将其关闭1。我猜它返回的PID是
当前 进程的PID ,而不是启动的PID ,并且新进程获得的“下一个” pid为高1。在这种情况下,我不能仅仅依靠返回值,process.pid + 1
因为我不能保证它总是正确的。
为什么不process.pid
返回新流程的PID,如何实现所追求的行为?
从位于http://docs.python.org/library/subprocess.html的文档中:
Popen.pid子进程的进程ID。
请注意,如果将shell参数设置为True,则这是生成的shell的进程ID。
shell
我认为,如果为假,它将表现出预期的效果。
如果你依靠shell
是True
解决使用可执行文件的路径PATH
环境变量,您可以使用完成同样的事情shutil.which
,而不是,然后传递给POPEN的绝对路径来代替。(subprocess.run
顺便说一句,如果您使用的是Python
3.5或更高版本,则应该使用而不是Popen。
问题内容: 我正在使用popen()打开一个长期运行的过程。对于调试,我想在完成之前终止该过程。调用pclose()只会阻塞直到子项完成。 我如何杀死这个过程?我没有找到任何简单的方法来从popen()返回的资源中获取pid,以便可以向其发送信号。 我想我可以做些杂乱的事情,并尝试使用某种命令行黑客将pid混入输出中… 问题答案: 好了,找到了一个解决方案:我改回而不是。然后就这么简单:
问题内容: 我正在尝试运行可执行文件并使用;捕获其输出;但是,我似乎并没有获得全部输出。 手动打开时,它比原始exe文件少打印两行。 我尝试了一种具有相同结果的替代方法: 任何人都可以帮助我获取exe的完整数据吗? 正如塞巴斯蒂安的要求: 原始exe文件最后几行o / p: -Gdd:通用计数(1-1000) -Cdd:切割起始于(0-99)-Edd:切割终止于(1-100) 请在下面选择流文件编
问题内容: 有谁知道如何使用Java获取当前打开的窗口或本地计算机的进程? 我想做的是:像Windows Taskmanager一样列出当前打开的任务,窗口或打开的进程,但要使用多平台方法-如果可能,仅使用Java。 问题答案: 这是从命令 解析进程列表的另一种方法: 如果你使用的是Windows,则应更改以下行:等(第三行),如下所示: 希望该信息对你有所帮助!
我能把1打印出来吗? 我尝试了以下: 它返回给我一个错误: 给定的选择器。//[@id='version id']/tbody/tr/td[2]/span/text()无效或不会导致webelement。出现以下错误:InvalidSelectorError:xpath表达式“.//[@id='version id']/tbody/tr/td[2]/span/Text()”的结果是:[object
问题内容: 我对使用时如何搜索可执行文件感到困惑。如果给子进程提供了绝对路径,那么它就可以工作,但是我正在尝试使用相对路径。我发现,如果设置环境变量PYTHONPATH,则可以从该路径中获取导入的模块,并且PYTHONPATH在其中,但似乎对的行为没有帮助。我也尝试编辑将PYTHONPATH添加到的文件,就像这样 并验证了在以交互方式,与ipython或通过从命令行运行脚本启动python时,PY
问题内容: 我正在尝试使用PyQt为名为“ HandBrake”的视频转换器应用程序构建一个简单的GUI。 我的问题是,当我选择要转换的视频文件时,子进程Popen使用必需的args启动手刹应用程序,但是在等待手刹完成gui时会被阻止,因此我无法进行任何更改。(例如:我不能禁用按钮,也不能更改其文本) 我不是在寻找更复杂的解决方案,例如progressbar等,但是我想在等待程序完成转换的同时简单