python执行系统命令(windows)

时间:2013-05-16 01:18:09

标签: python path system

所以我有这个超级脚本不断检查程序的系统路径(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,但如果不是pathWHERE 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中太深入,无法切换语言。太糟糕了。

2 个答案:

答案 0 :(得分:1)

实际上,因为当您的程序启动时,它已配置了一个环境。该环境的一部分是系统路径。当您启动子shell时,它会继承父进程的环境。

我不是Windows程序员,我现在没有可用于测试的Windows机器。但根据该错误报告,如果您在脚本import ntreload(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