Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么inspect.getfile会给我一个';不在那里吗?_Python_Python 2.7_Python Import_Urllib3_Dockerpy - Fatal编程技术网

Python 为什么inspect.getfile会给我一个';不在那里吗?

Python 为什么inspect.getfile会给我一个';不在那里吗?,python,python-2.7,python-import,urllib3,dockerpy,Python,Python 2.7,Python Import,Urllib3,Dockerpy,或者,Saltstack+docker pyAttributeError:“RecentlyUsedContainer”对象没有属性“lock” 我一直在深入研究这个问题,但毫无结果。我试图使用SaltStack管理docker图像/容器,但遇到了问题 最初我使用的是salt statedocker.running,但作为命令显示的并不存在。当我将状态更改为docker.running时,我得到了在GitHub问题上发布的回溯: ID: scheduler Function: doc

或者,Saltstack+docker py
AttributeError:“RecentlyUsedContainer”对象没有属性“lock”

我一直在深入研究这个问题,但毫无结果。我试图使用SaltStack管理docker图像/容器,但遇到了问题

最初我使用的是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
在谷歌搜索了一段时间后,我什么也没找到,于是我开始了

在阅读了
unixconn.py
并意识到
最近使用的容器
来自urllib3之后,我找到了它的源代码,发现有一个
\u lock
属性在不久前被更改为
lock
。这似乎很奇怪

我仔细查看了导入,发现
unixconn.py
试图使用请求内置的urllib3,然后又回到了独立的urllib3。所以我检查了请求urllib3,发现它确实更改了
\u lock->lock
。但它比我的请求版本更新。所以我升级了请求并重试。仍然没有骰子-相同的
AttributeError

现在事情开始变得奇怪了

为了把信息反馈给我的盐主人,我开始在我的盐仆从身上乱搞docker py和urllib3代码。起初,我用
urllib3.\u_文件\u_
引发异常,以确保使用了正确的文件。但有时它返回的文件名位于不存在的文件和文件夹中。通常它显示的是
/usr/local/lib/python2.7/dist packages/requests/packages/urllib3/_collections.pyc
,但当我删除该文件时,我认为缓存的.pyc可能会导致问题,它仍然会说那是
\u文件,即使它不存在

然后我发现
inspect.getfile
。我得到了同样奇怪的行为-我可以删除.pyc文件,但是
inspect.getfile(self.pools)
会返回不存在的文件

为了让生活更美好,我补充道

raise Exception('Pining for the Fjords')

在最近使用的容器的末尾。然而,这一例外并没有引起人们的注意

我刚刚证实了事实上有什么东西在骗我,因为尽管改变了
unixconn.py

 def get_connection(self, url, proxies=None):                                
     import inspect                                                          
     r = RecentlyUsedContainer(10)                                           
     raise Exception(inspect.getfile(r.__class__) + '\n' + r.__doc__) 
它返回
/usr/local/lib/python2.7/dist packages/requests/packages/urlib3/_collections.pyc
,当我编辑该.pyc并修改
最近使用的容器的docstring时,我获取原始docstring

最后,当我编辑
/usr/lib/python2.7/dist-packages/urllib3/_-collections.pyc
并更改其docstring时(或者使用相同的路径,但改为
_-collections.py

我仍然得到相同的文档串


为什么这里会执行错误的代码,我如何才能找到它的位置,以便解决问题?

因此我最终解决了问题:

这确实和盐有关。出于某种原因,盐仆从导入docker py库的方式做了某种。。。部分保留进口。我怀疑发生的事情是salt只重新导入了docker py库,所以当我对这些文件进行更改时,更改就会显示出来

但是,由于Python导入机制将首先搜索预导入的模块,因此urllib3代码从未重新导入

最终,所需的只是重新启动salt minion:

salt 'my-minion' cmd.run "nohup /bin/sh -c 'sleep 10 && salt-call --local service.restart salt-minion'"
salt 'my-minion' cmd.run "nohup /bin/sh -c 'sleep 10 && salt-call --local service.restart salt-minion'"