我正在使用killableprocess包(构建在子进程之上)来运行进程每当我在脚本中运行"killableprocess.Popen(command)"代码时,我都会收到以下错误:
File "killableprocess.py", line 157, in _execute_child
winprocess.AssignProcessToJobObject(self._job, hp)
File "winprocess.py", line 37, in ErrCheckBool
raise WinError()
WindowsError [error 5] Access is denied
Exception TypeError: "'NoneType' object is not callable" in <bound method AutoHANDLE.__del__ of <AutoHANDLE object at 0x025D42B0>> ignored
Run Code Online (Sandbox Code Playgroud)
但是当我从python交互式控制台(python 2.6)运行它时它工作正常.这可能意味着当我从脚本运行时存在权限问题,但我不知道如何解决它们.我尝试从我以管理员身份运行的cmd运行脚本,但它没有帮助.尝试寻找类似的帖子,但没有找到任何好的解决方案.希望在这里找到一些帮助我在Windows上运行,特别是Windows 7 Ultimate x64,如果有任何帮助的话.
谢谢
我不知道这是否是执行系统进程,并从母公司分离的正确途径,但允许家长从退出而不创建一个僵尸和/或杀死子进程.我目前正在使用子进程模块并执行此操作...
os.setsid()
os.umask(0)
p = subprocess.Popen(['nc', '-l', '8888'],
cwd=self.home,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)
os.setsid()更改了进程组,我认为这是让进程在父进程退出时继续运行的原因,因为它不再属于同一进程组.
这是正确的,这也是一种可靠的执行方式吗?
基本上,我有一个远程控制实用程序,通过套接字进行通信,允许远程启动进程,但我必须确保如果远程控制器死亡,它启动的进程继续运行不受影响.
我正在阅读关于双叉并且不确定这是否必要和/或subprocess.POpen close_fds以某种方式处理这个问题,所需要的只是更改进程组?
谢谢.
伊利亚
我已经成功运行了几个Python脚本,使用子进程模块从基本脚本调用它们:
subprocess.popen([sys.executable, 'script.py'], shell=True)
Run Code Online (Sandbox Code Playgroud)
但是,这些脚本中的每一个都会执行一些模拟(来自C++应用程序的.exe文件),这些模拟会向shell生成一些输出.所有这些输出都写入我发布这些脚本的基本shell.我想为每个脚本生成一个新shell.我shell=True在调用subprocess.call时尝试使用该属性生成新shell (也尝试使用popen),但它不起作用.
如何为subprocess.call生成的每个进程获取一个新shell?
我正在阅读Spencer建议的关于stdin和stdout的文档,并找到了解决问题的标志:subprocess.CREATE_NEW_CONSOLE.也许重定向管道也可以完成工作,但这似乎是最简单的解决方案(至少对于这个特定的问题).我刚测试它并完美地工作:
subprocess.popen([sys.executable, 'script.py'], creationflags = subprocess.CREATE_NEW_CONSOLE)
Run Code Online (Sandbox Code Playgroud) 我有一个全局var foo ="some value"和一个后台进程back_func,我想要后台进程来访问$ foo并修改它的值,这可以通过主进程看到.它类似于以下内容:
#!/bin/bash
foo=0
function back_func {
foo=$(($foo+1))
echo "back $foo"
}
(back_func) &
echo "global $foo"
Run Code Online (Sandbox Code Playgroud)
上面脚本的结果是
global 0
back 1
Run Code Online (Sandbox Code Playgroud)
我怎么能得到全局和后退的结果都是'1'?,即后台进程的修改可以返回到主进程.
所以我注意到subprocess.call在继续使用python脚本之前它等待命令完成,我无法获得stdout,除了subprocess.Popen.有任何替代函数调用会等到它完成吗?(我也试过Popen.wait)
注意:我试图避免 os.system通话
result = subprocess.Popen([commands...,
self.tmpfile.path()], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = result.communicate()
print out+"HIHIHI"
Run Code Online (Sandbox Code Playgroud)
我的输出:
HIHIHI
Run Code Online (Sandbox Code Playgroud)
注意:我试图wine用这个运行.
我试图找到一种方法来忽略stderr流(类似于2> /dev/null):
output = subprocess.check_output("netstat -nptl".split())
Run Code Online (Sandbox Code Playgroud)
我应该在上面的命令中添加什么来实现呢?
我正在尝试使用子进程模块和线程内的Popen启动'rsync'.在我调用rsync之后,我还需要读取输出.我正在使用通信方法来读取输出.我不使用线程时代码运行正常.看来,当我使用一个线程时,它会挂在通信呼叫上.我注意到的另一件事是,当我设置shell = False时,在线程中运行时,我从通信中得不到任何回报.
我正在使用Python 2.6中的GUI前端,通常它非常简单:您使用subprocess.call()或subprocess.Popen()发出命令并等待它完成或对错误做出反应.如果您的程序停止并等待用户交互,您会怎么做?例如,程序可能会停止并询问用户是否有ID和密码或如何处理错误?
c:\> parrot
Military Macaw - OK
Sun Conure - OK
African Grey - OK
Norwegian Blue - Customer complaint!
(r) he's Resting, (h) [Hit cage] he moved, (p) he's Pining for the fjords
Run Code Online (Sandbox Code Playgroud)
到目前为止,我所阅读的所有内容都告诉您如何在程序完成后才读取程序的所有输出,而不是在程序运行时如何处理输出.我无法安装新模块(这是一个LiveCD),我将不止一次处理用户输入.
我试图使用rsync与subprocess.call.奇怪的是,如果我传递subprocess.call一个字符串,它可以工作,但它不适用于列表(ala,Python的doc).
In [23]: sp.call("rsync -av content/ writings_raw/", shell=True)
sending incremental file list
sent 6236 bytes received 22 bytes 12516.00 bytes/sec
total size is 324710 speedup is 51.89
Out[23]: 0
Run Code Online (Sandbox Code Playgroud)
In [24]: sp.call(["rsync", "-av", "content/", "writings_raw/"], shell=True)
rsync version 3.0.9 protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, symtimes
rsync comes …Run Code Online (Sandbox Code Playgroud) 我有一个命令行工具(实际上是几个),我正在用Python编写包装器.
该工具通常使用如下:
$ path_to_tool -option1 -option2 > file_out
Run Code Online (Sandbox Code Playgroud)
用户将输出写入file_out,并且还能够在工具运行时查看该工具的各种状态消息.
我想复制此行为,同时还将stderr(状态消息)记录到文件中.
我有的是这个:
from subprocess import call
call(['path_to_tool','-option1','option2'], stdout = file_out, stderr = log_file)
Run Code Online (Sandbox Code Playgroud)
除了stderr没有写入屏幕之外,这工作正常.我当然可以添加代码来将log_file的内容打印到屏幕上,但是用户将在完成所有操作后看到它,而不是在它发生时.
总结一下,期望的行为是:
我有一种感觉,我要么错过了一些非常简单的东西,要么这比我想象的要复杂得多......感谢您的帮助!
编辑:这只需要在Linux上工作.
subprocess ×10
python ×9
background ×1
bash ×1
command-line ×1
frontend ×1
global ×1
linux ×1
popen ×1
python-2.7 ×1
rsync ×1
stderr ×1
unix ×1
variables ×1
windowserror ×1