所以我有这个超级脚本不断检查程序的系统路径(openvpn
)。安装openvpn时,它会将自身添加到系统路径中。我在控制台中运行我的脚本,当它运行并检查时,我安装openvpn。在该控制台中,我的脚本永远不会在sys路径中找到openvpn。如果我打开一个新的控制台并运行相同的脚本,它就会找到它。
我知道如何让我的剧本变得不那么愚蠢吗?
import os
import time
import subprocess
def cmd( command ):
return subprocess.check_output( command, shell = True )
def program_in_path( program ):
path = cmd( "path" ).split(";")
for p in path:
if "openvpn" in p.lower():
return True
return False
if __name__ == '__main__':
while True:
print program_in_path("openvpn")
time.sleep( 2 )
我认为它来自shell = True
,但如果不是path
或WHERE openvpn /Q
,我怎么能找到它?没有sehll运行我得到WindowsError: [Error 2] The system cannot find the file specified
这里的程序与ruby中完全相同的程序100%:
loop do
puts system( "WHERE openvpn /Q" )
sleep( 5 )
end
不幸的是,我的项目在python中太深入,无法切换语言。太糟糕了。
答案 0 :(得分:1)
实际上,因为当您的程序启动时,它已配置了一个环境。该环境的一部分是系统路径。当您启动子shell时,它会继承父进程的环境。
我不是Windows程序员,我现在没有可用于测试的Windows机器。但根据该错误报告,如果您在脚本import nt
和reload(nt)
循环中while True
,它将从系统中提取环境的新副本。我不知道这是不是真的。值得一试。
对于它的价值,您可以在cmd窗口中看到相同的行为,例如,打开命令窗口,将程序文件夹添加到系统路径,然后尝试从您的程序文件夹中运行exe现有的cmd窗口。它不起作用 - 但打开一个新的cmd窗口,它会。
您引用的错误报告是关于另一个问题。从Python中可以看出,如果您加载其中一个系统DLL并使用Windows提供的特定功能来操作您的环境,那么Python就不会反映这一变化。但是,如果您对os.environ进行了更改,Python会识别出该更改。社区的结论是,记者使用的特定功能,并不是用于获得预期结果的正确功能。
答案 1 :(得分:1)
也许这种方法适合您,直接从注册表获取PATH变量(因为您在Windows上)。
例如,您可以这样做:
import winreg
def PathFromReg():
loc = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
key = winreg.OpenKey(reg, loc)
n_val = winreg.QueryInfoKey(key)[1]
for i in range(n_val):
val = winreg.EnumValue(key, i)
if val[0] == 'Path':
return val[1]
path = PathFromReg()
print('openvpn' in path.lower())
我认为您只需要分配一次密钥然后查询循环内的值。
注意:在Python 2中,该模块名为_winreg
。