python执行系统命令(windows)

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

所以我有一个uber脚本,它不断检查程序的系统路径(
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的等价物。