Python版本:2.6.4
面料版本:1.9.0
我有一个自动化测试框架,可以使用 threading.Thread(在我的案例中为 3 个线程)并行执行案例。
每个线程工作者都使用fabric put(我们在这个函数上做了一些包装)将由tempfile.mkstemp创建的临时文件复制到远程文件。
问题是它总是给我一个找不到文件的错误,该错误发生在异常提示的“放置”期间。
这是“放置”时的代码:
MyShell.py(MyFabShell 的父类)
def putFileContents(self, file, contents):
fd, tmpFile= tempfile.mkstemp()
os.system('chmod 777 %s' % tmpFile)
contentsFile = open(tmpFile, 'w')
contentsFile.write(contents)
contentsFile.close()
dstTmpFile = self.genTempFile()
localshell = getLocalShell()
self.get(localshell, tmpFile, dstTmpFile) # use local shell to put tmpFile to dstTmpFile
os.close(fd)
os.remove(tmpFile)
#os.remove(tmpFile)
MyFabShell.py:
def get( self, srcShell, srcPath, dstPath ):
srcShell.put( self, srcPath, dstPath )
def put(self, dstShell, srcpath, dstpath):
if not self.pathExists( srcPath ): # line 158
raise Exception( "Cannot put <%s>, does not exist." % srcPath )
# do fabric get/put in the following
# ...
调用 put 导致错误:
...
self.shell.putFileContents(configFile, contents)
File "/path/to/MyShell.py", line 401, in putFileContents
self.get(localShell, tmpFile, dstTmpFile)
File "/path/to/MyFabShell.py", line 134, in get
srcShell.put( self, srcPath, dstPath )
File "/path/to/myFabShell.py", line 158, in put
raise Exception( "Cannot put <%s>, does not exist." % srcPath )
Exception: Cannot put </tmp/tmpwt3hoO>, does not exist.
我最初怀疑该文件可能会在 期间被删除put
,所以我发表了评论os.remove
。但是,我又遇到了同样的错误。从异常日志来看,这不应该是“fabric put”的问题,因为在执行fabric get/put 之前抛出异常mkstemp
涉及多线程时是否不安全?但是文件说“文件的创建没有竞争条件”或者我的案例是否因为 GIL 而失败?我怀疑这是因为当我只使用 1 个线程时,一切都会好起来的。
谁能给我一些关于我的错误的线索?我一直在努力解决这个问题:(