我想在后台打开一个进程并与之交互,但这个进程在Linux和Windows中都应该是不可见的.在Windows中,您必须使用STARTUPINFO执行某些操作,而这在Linux中无效:
ValueError:仅在Windows平台上支持startupinfo
有没有比为每个操作系统创建单独的Popen命令更简单的方法?
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
if os.name == 'posix':
proc = subprocess.Popen(command)
Run Code Online (Sandbox Code Playgroud) 我有一个带有GUI的程序,通过Popen调用运行外部程序:
p = subprocess.Popen("<commands>" , stdout=subprocess.PIPE , stderr=subprocess.PIPE , cwd=os.getcwd())
p.communicate()
Run Code Online (Sandbox Code Playgroud)
但是无论我做什么,都会弹出控制台(我也尝试将NUL传递给文件句柄).如果没有得到我调用的二进制文件来释放它的控制台,有没有办法做到这一点?
如果我将我的代码文件保存为.pyw,则不会出现控制台窗口 - 这就是我想要的 - 但如果代码包含调用os.system,我仍然会得到一个讨厌的控制台窗口.我认为这是由呼叫引起的os.system.有没有办法从我的.pyw脚本中执行其他文件而根本不提高控制台窗口?
我在Windows上使用python 2.7来使用dcraw和PIL自动执行批量RAW转换.
问题是我每次运行dcraw时都会打开一个Windows控制台(每隔几秒就会发生一次).如果我使用.py运行脚本它不那么烦人,因为它只打开主窗口,但我更愿意只呈现GUI.
我是这样介入的:
args = [this.dcraw] + shlex.split(DCRAW_OPTS) + [rawfile]
proc = subprocess.Popen(args, -1, stdout=subprocess.PIPE)
ppm_data, err = proc.communicate()
image = Image.open(StringIO.StringIO(ppm_data))
Run Code Online (Sandbox Code Playgroud)
感谢Ricardo Reyes
次要修订到配方,在2.7看来,你需要得到STARTF_USESHOWWINDOW来自_subprocess(您也可以使用pywin32,如果你想要的东西,可能有点不太容易发生变化),所以为后人:
suinfo = subprocess.STARTUPINFO()
suinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(args, -1, stdout=subprocess.PIPE, startupinfo=suinfo)
Run Code Online (Sandbox Code Playgroud)