【问题标题】:Checking user's network environment - Python application检查用户的网络环境 - Python 应用程序
【发布时间】:2014-06-29 14:20:16
【问题描述】:

我的 Python 应用程序连接到 MSSQL 数据库以验证某些事项编号,但此步骤仅用于协助数据完整性,不会为用户带来任何附加功能。

只有在我办公室的本地网络上才能访问该数据库。如何在启动过程中检查用户的环境以查看是否可以建立此连接?

我正在使用 pyodbc,但我还需要这个程序在 OS X 上运行,所以我不会导入那个模块,直到这个检查返回一个肯定的结果。有任何想法吗?

【问题讨论】:

    标签: python windows macos pyodbc pymssql


    【解决方案1】:

    你可以试试这样的:

    #!/usr/bin/python
    import socket
    
    mssql_server = 'foobar.example.not' # set this to your own value
    s = socket.socket()
    s.settimeout(3)
    try:
        server = [x for x in socket.getaddrinfo(mssql_server,1433) if x[0]==2 ][0][-1]
    except socket.gaierror:
        server = None
    if server:
        try:
            s.connect(server)
        except (socket.timeout, socket.error):
            server = None
    s.close()
    

    ...这应该尝试为您的服务器查找 IPv4 地址(使用 getaddrinfo() 返回的第一个地址),然后尝试连接到该系统上的 MS SQL TCP 端口(默认为 1433)。 (是的,如果您的服务器在不同的端口上,请更改 1433)。如果尝试时报告超时或任何其他套接字错误,则服务器设置为None。否则,您可能拥有可以访问的 MS SQL 服务器。

    【讨论】:

    • 如果我无法得到小熊的回答,这将是我的备用计划。谢谢吉姆。
    • 您的问题标签表示 SQL Server,它可能在默认端口 1433 上运行。
    • 啊。我的错误,我刚刚回答了一个不同的问题,即 MySQL 而不是 MS SQL。
    【解决方案2】:

    在导入前使用 ping 验证主机是否可用:

    import subprocess
    
    host = "<hostname>"
    # add sample text for ping resolution errors here
    errors = ("could not find", "unreachable")
    
    ping = "ping {0}".format(host)
    (stdout, stderr) = subprocess.Popen(ping, stdout=subprocess.PIPE).communicate()
    
    # stdout is a byte string and must be decoded before compare
    if not any(error in stdout.decode("utf-8") for error in errors):
        import pyodbc
        .....
    

    【讨论】:

    • 我认为这行得通!我明天要在工作中测试它,看看效果如何。谢谢你的帮助,小熊!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多