为什么 inspect.getfile 给我一个不存在的文件?
Why would inspect.getfile give me a file that's not there?
或者,Saltstack + docker-py AttributeError: 'RecentlyUsedContainer' object has no attribute 'lock'
我一直在深入研究这个问题,但无济于事。我正在尝试使用 SaltStack 来管理我的 docker images/containers 但 运行 变成 this problem.
最初我使用的是 salt state docker.running
但它显示为命令不存在。当我将状态更改为 docker.running
时,我得到了我在那个 GitHub 问题上发布的回溯:
ID: scheduler
Function: docker.pulled
Result: False
Comment: An exception occurred in this state: Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/salt/state.py", line 1563, in call
**cdata['kwargs'])
File "/usr/lib/python2.7/dist-packages/salt/states/dockerio.py", line 271, in pulled
returned = pull(name, tag=tag, insecure_registry=insecure_registry)
File "/usr/lib/python2.7/dist-packages/salt/modules/dockerio.py", line 1599, in pull
client = _get_client()
File "/usr/lib/python2.7/dist-packages/salt/modules/dockerio.py", line 277, in _get_client
client._version = client.version()['ApiVersion']
File "/usr/local/lib/python2.7/dist-packages/docker/client.py", line 837, in version
return self._result(self._get(url), json=True)
File "/usr/local/lib/python2.7/dist-packages/docker/clientbase.py", line 86, in _get
return self.get(url, **self._set_request_timeout(kwargs))
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 310, in get
#: Stream response content default.
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 279, in request
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 374, in send
url=request.url,
File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 155, in send
**proxy_kwargs)
File "/usr/local/lib/python2.7/dist-packages/docker/unixconn/unixconn.py", line 74, in get_connection
with self.pools.lock:
AttributeError: 'RecentlyUsedContainer' object has no attribute 'lock'
Started: 09:33:42.873628
Duration: 22.115 ms
再搜索 Google 之后一无所获,我继续并开始了 reading the source。
在阅读 unixconn.py
并意识到 RecentlyUsedContainer
来自 urllib3 之后,我去寻找它的来源并发现有一个 _lock
属性被更改为lock
刚才。好像st运行ge.
我仔细查看了导入并意识到 unixconn.py
试图使用请求的内置 urllib3,然后 然后 退回到独立的 urllib3。所以我查看了请求 urllib3,发现确实有 _lock -> lock
更改。但它比请求的 my 版本更新。所以我升级了请求并再次尝试。仍然没有骰子 - 相同 AttributeError
.
现在事情开始变得奇怪了。
为了将信息返回给我的 salt master,我开始在我的 salt minion 上处理 docker-py 和 urllib3 代码。起初我用 urllib3.__file__
引发异常以确保我使用的是正确的文件。但偶尔 return 的文件名在 不存在 的文件和文件夹中。通常它显示 /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/_collections.pyc
,但当我删除该文件时认为可能正在缓存的 .pyc 导致了问题,它仍然会说那是 __file__
,即使它不存在。
然后我发现了inspect.getfile
。我得到了同样奇怪的行为 - 我可以删除 .pyc 文件,但 inspect.getfile(self.pools)
会 return 不存在的文件。
为了让生活更美好,我加了
raise Exception('Pining for the Fjords')
到
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/_collections.py
RecentlyUsedContainer.__init__
结束。然而,该异常 不会引发 .
而且我刚刚确认 是 实际上是在骗我,因为尽管 unixconn.py
def get_connection(self, url, proxies=None):
import inspect
r = RecentlyUsedContainer(10)
raise Exception(inspect.getfile(r.__class__) + '\n' + r.__doc__)
which returns /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/_collections.pyc
,当我编辑 .pyc 并修改 RecentlyUsedContainer
的文档字符串时,我 得到原始文档字符串 .
最后,当我编辑 /usr/lib/python2.7/dist-packages/urllib3/_collections.pyc
并更改 它是 文档字符串时,(或相同的路径,但 _collections.py
代替)...
我仍然得到相同的文档字符串!
为什么这里执行了错误的代码,我怎样才能找到错误代码的位置以便解决问题?
所以我终于想通了问题:
它确实与盐有关。出于某种原因,salt minion 导入 docker-py 库的方式做了某种……部分保留导入。我怀疑发生的事情是 salt 正在重新导入 just docker-py 库,所以当我对这些文件进行更改时,更改会显示出来。
但是,由于 Python 导入机制将首先搜索预先导入的模块,所以 urllib3 代码从未被重新导入。
最终只需要重启 salt minion:
salt 'my-minion' cmd.run "nohup /bin/sh -c 'sleep 10 && salt-call --local service.restart salt-minion'"
或者,Saltstack + docker-py AttributeError: 'RecentlyUsedContainer' object has no attribute 'lock'
我一直在深入研究这个问题,但无济于事。我正在尝试使用 SaltStack 来管理我的 docker images/containers 但 运行 变成 this problem.
最初我使用的是 salt state docker.running
但它显示为命令不存在。当我将状态更改为 docker.running
时,我得到了我在那个 GitHub 问题上发布的回溯:
ID: scheduler
Function: docker.pulled
Result: False
Comment: An exception occurred in this state: Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/salt/state.py", line 1563, in call
**cdata['kwargs'])
File "/usr/lib/python2.7/dist-packages/salt/states/dockerio.py", line 271, in pulled
returned = pull(name, tag=tag, insecure_registry=insecure_registry)
File "/usr/lib/python2.7/dist-packages/salt/modules/dockerio.py", line 1599, in pull
client = _get_client()
File "/usr/lib/python2.7/dist-packages/salt/modules/dockerio.py", line 277, in _get_client
client._version = client.version()['ApiVersion']
File "/usr/local/lib/python2.7/dist-packages/docker/client.py", line 837, in version
return self._result(self._get(url), json=True)
File "/usr/local/lib/python2.7/dist-packages/docker/clientbase.py", line 86, in _get
return self.get(url, **self._set_request_timeout(kwargs))
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 310, in get
#: Stream response content default.
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 279, in request
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 374, in send
url=request.url,
File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 155, in send
**proxy_kwargs)
File "/usr/local/lib/python2.7/dist-packages/docker/unixconn/unixconn.py", line 74, in get_connection
with self.pools.lock:
AttributeError: 'RecentlyUsedContainer' object has no attribute 'lock'
Started: 09:33:42.873628
Duration: 22.115 ms
再搜索 Google 之后一无所获,我继续并开始了 reading the source。
在阅读 unixconn.py
并意识到 RecentlyUsedContainer
来自 urllib3 之后,我去寻找它的来源并发现有一个 _lock
属性被更改为lock
刚才。好像st运行ge.
我仔细查看了导入并意识到 unixconn.py
试图使用请求的内置 urllib3,然后 然后 退回到独立的 urllib3。所以我查看了请求 urllib3,发现确实有 _lock -> lock
更改。但它比请求的 my 版本更新。所以我升级了请求并再次尝试。仍然没有骰子 - 相同 AttributeError
.
现在事情开始变得奇怪了。
为了将信息返回给我的 salt master,我开始在我的 salt minion 上处理 docker-py 和 urllib3 代码。起初我用 urllib3.__file__
引发异常以确保我使用的是正确的文件。但偶尔 return 的文件名在 不存在 的文件和文件夹中。通常它显示 /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/_collections.pyc
,但当我删除该文件时认为可能正在缓存的 .pyc 导致了问题,它仍然会说那是 __file__
,即使它不存在。
然后我发现了inspect.getfile
。我得到了同样奇怪的行为 - 我可以删除 .pyc 文件,但 inspect.getfile(self.pools)
会 return 不存在的文件。
为了让生活更美好,我加了
raise Exception('Pining for the Fjords')
到
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/_collections.py
RecentlyUsedContainer.__init__
结束。然而,该异常 不会引发 .
而且我刚刚确认 是 实际上是在骗我,因为尽管 unixconn.py
def get_connection(self, url, proxies=None):
import inspect
r = RecentlyUsedContainer(10)
raise Exception(inspect.getfile(r.__class__) + '\n' + r.__doc__)
which returns /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/_collections.pyc
,当我编辑 .pyc 并修改 RecentlyUsedContainer
的文档字符串时,我 得到原始文档字符串 .
最后,当我编辑 /usr/lib/python2.7/dist-packages/urllib3/_collections.pyc
并更改 它是 文档字符串时,(或相同的路径,但 _collections.py
代替)...
我仍然得到相同的文档字符串!
为什么这里执行了错误的代码,我怎样才能找到错误代码的位置以便解决问题?
所以我终于想通了问题:
它确实与盐有关。出于某种原因,salt minion 导入 docker-py 库的方式做了某种……部分保留导入。我怀疑发生的事情是 salt 正在重新导入 just docker-py 库,所以当我对这些文件进行更改时,更改会显示出来。
但是,由于 Python 导入机制将首先搜索预先导入的模块,所以 urllib3 代码从未被重新导入。
最终只需要重启 salt minion:
salt 'my-minion' cmd.run "nohup /bin/sh -c 'sleep 10 && salt-call --local service.restart salt-minion'"