2017-06-10 50 views
0

我有一個必須通過管道進行通信的進程。它在Windows 10的Windows XP SP3兼容模式下正常工作,但在其他模式下無法正常工作。使用subprocess.Popen(),以便子進程在Windows上以兼容模式啓動

但是,即使使用shell = True,子流程似乎也不在乎兼容模式。我想如果shell啓動它,而不是直接進入內核,請求CM將被保留,但它不會。從cmd.exe啓動時,它按預期在XP兼容模式下運行。

如何強制子進程以兼容模式啓動它?還是使用shell = True加上一些特殊的環境變量的問題?

該進程是Cygwin的ssh.exe,它具有在Windows 10上打開的密鑰權限的大問題。在XP中使用它CM會誘使它忽略ACL,否則該ACL會進入posix版本的權限模式。事情是,我不能指望用戶爲他們通過屬性添加的每個密鑰設置正確的權限,並且在程序中自動執行它是很複雜的,因爲程序可能沒有權限這樣做。這是一個大混亂。任何想法都表示讚賞。

+0

一個解決方案是使用Microsoft應用程序兼容性工具包來創建一個明確的兼容性修補程序(一個定義.sdb文件),然後安裝修訂旁邊程序。這可能比使用註冊表項更靈活一些。 –

+0

...你使用的是32位版本的Python嗎?可能需要明確選擇「cmd.exe」的64位版本,即「c:\ windows \ sysnative \ cmd.exe/c myapp.exe」,並查看是否有任何區別。 –

回答

1

你可以嘗試調用ssh.exe前設置__COMPAT_LAYER

import os 
import subprocess 

os.environ.update({"__COMPAT_LAYER": "WinXP"}) # set it to WinXP 

your_process = proc = subprocess.Popen(["ssh", "whatever"], shell=True, env=os.environ) 
# ... 
+0

爲什麼不只是'os.environ [「__ COMPAT_LAYER」] =「WinXP」'? – phd

+0

@phd - 沒有什麼特別的理由,我喜歡設置多個環境變量,所以這是一種反射。 – zwer

+0

不起作用。看起來,__COMPAT_LAYER是由操作系統設置的,以告訴你的應用程序它在兼容模式下運行。以便您的應用程序可以根據需要採取行動。不過+1無論如何都是一個好的嘗試。 – Dalen

相關問題