python执行系统命令(windows)
所以我有一个uber脚本,它不断检查程序的系统路径(python执行系统命令(windows),python,path,system,Python,Path,System,所以我有一个uber脚本,它不断检查程序的系统路径(openvpn)。当您安装openvpn时,它会将自身添加到系统路径中。我在控制台中运行我的脚本,当它运行和检查时,我安装openvpn。在那个控制台中,我的脚本永远不会在syspath中找到openvpn。如果我打开一个新控制台并运行相同的脚本,它会找到它 你知道我怎样才能让我的剧本不那么愚蠢吗 import os import time import subprocess def cmd( command ): return su
openvpn
)。当您安装openvpn时,它会将自身添加到系统路径中。我在控制台中运行我的脚本,当它运行和检查时,我安装openvpn。在那个控制台中,我的脚本永远不会在syspath中找到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:[错误2]系统找不到指定的文件
这是一个用ruby编写的程序,它可以100%工作:
loop do
puts system( "WHERE openvpn /Q" )
sleep( 5 )
end
不幸的是,我的项目太深入python,现在无法切换语言。太糟糕了。这实际上是因为当程序启动时,它配置了一个环境。该环境的一部分是系统路径。启动子shell时,它将继承父进程的环境 我不是一个Windows程序员,而且我现在没有一台Windows机器可供测试。但根据该bug报告,如果您在脚本中导入nt,并在
中重新加载(nt)
,而在中执行True
循环,它将从系统中拖出一个新的环境副本。我不知道那是不是真的。也许值得一试
值得一提的是,您可以在cmd窗口中看到相同的行为,例如,打开命令窗口,将程序文件夹添加到系统路径,然后尝试在现有cmd窗口中从该程序文件夹运行exe。它不会工作——但是打开一个新的cmd窗口,它就会工作
你引用的bug报告是关于另一个问题的。这里概述的问题是,在Python中,如果加载一个系统DLL并使用Windows提供的用于操作环境的特定函数,Python不会反映出更改。但是,如果您对os.environ进行了更改,Python会识别该更改。社区得出的结论是,报告者使用的特定函数不是获得预期结果的正确函数。也许这种方法适合您,直接从注册表获取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())
我认为您只需要分配一次键,然后查询循环中的值
注意:在Python2中,该模块称为
\u winreg
,这将检查路径是否有一个名称中包含openvpn
的文件夹。这就是你要找的吗?我知道它是干什么的。我还可以使用WHERE openvpn/Q
获得相同的结果。查看我的最新问题。似乎。。我搞砸了,那个虫子报告快13年了。为什么不运行openvpn
而不运行shell=True
,直到它工作为止?是的,很快就要上大学了。尽管如此,它仍然充满活力和活力。他们可能认为这毕竟不是一个python bug,也不使用重载。自从我找到错误报告后就试过了。我知道它指向了一个稍微不同的东西,但他们确实提到在重新加载(os)时,env
不会刷新。不幸的是,我现在没有解决方案了。值得一提的是,如果你在Linux或Mac操作系统下运行,你也会有类似的行为。启动程序时,操作系统会将父进程的环境复制到子进程中。从那时起,两者之间就没有任何联系。在类似Unix的环境中,您可能会生成一个子shell,它将读取配置环境的.bashrc或.bash_概要文件。我认为把你的答案从注册表中拿出来是Windows的等价物。