2015-07-20 83 views
1

我正在寻找一种通用的方法来抑制一个特定的python脚本内的AAAA解决方案。有没有简单的方法来做到这一点?为python脚本禁用IPv6

使用YouTube数据API的Python这是使用httplib2都在握手的东西。我想我会需要像套接字覆盖或低级别的东西。

域来查找问题是一个谷歌的领域,因此针对特定的前缀是行不通的IPv6的喜好选择工作。

垫层问题是,我的IPv6地址,目前进行地理位于伊拉克是错误的...我已经申请到修复的要求,但想在此期间运行的脚本。

+1

你能具体谈谈你的脚本是干什么的?事实上,你是否可以发布一个[小的,自包含的工作示例](http://sscce.org/)来证明问题?由于这个问题目前已被解释,所以几乎不可能回答,因为我们不知道您的脚本正在使用哪些模块或库,无论是调用外部程序还是其他类型的程序。 –

+0

我使用httplib2对YouTube数据API进行身份验证。问题在于IPv6查找正在发生,似乎最好是我的默认设置。我正在寻找一个通用的--disable-ipv6标志,我可以在运行时调用它来禁止IPv6查找。 – Nexus2k

+0

您是否有管理员访问您的机器。您可以关闭机器上的IPV6,然后运行脚本。 –

回答

0

我用gai.conf方法以降低偏好整个/ 32的IPv6前缀。对我的用例足够好了。

3

有这个没有全局Python的开关,也不会出现提供任何办法来控制它。

使用socket.getaddrinfo(请参阅httplib2.HTTPConnectionWithTimeout.connect的来源)根据域名查找要连接的地址。它通过0作为家庭参数,这意味着使用任何可用的家庭。

所以,要解决这个问题,你需要有一些方法来覆盖它。一种方法是实现您自己的连接类,我们称之为IPv4Connection,它继承自httplib2.HTTPConnectionWithTimeouthttplib.Connection并覆盖connect以强制它使用IPv4,然后在调用Http.request(uri, connection_type=IPv4Connection)时将其作为connection_type参数传入。

另一个办法是猴子补丁socket.getaddrinfo迫使家庭纠纷始终是socket.AF_INET

另一种方法是使用底层方法让C库更喜欢IPv4或禁用IPv6。这将通过平台有所不同,但使用的glibc的Linux,你可以编辑/etc/gai.conf总是喜欢IPv6上的IPv4:

precedence ::ffff:0:0/96 100