Python バージョン: 2.6.4
生地のバージョン:1.9.0
threading.Thread(私の場合は3つのスレッド)を使用して、ケースを並行して実行する自動化テストフレームワークがあります。
各スレッド ワーカーは、fabric put (ただし、この関数にはラッパーを実行します) を使用して、tempfile.mkstemp によって作成された一時ファイルをリモート ファイルにコピーします。
問題は、ファイルが見つからないというエラーが常に表示されることです。エラーは、例外のヒントからの「プット」中に発生します。
「put」を実行するときのコードは次のとおりです。
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
ました。しかし、再び同じエラーが発生しました。例外ログから、ファブリック get/put の実行前に例外がスローされるため、「fabric put」の問題ではないはずmkstemp
です マルチスレッドが関係している場合は安全ではありませんか? しかし、ドキュメントには「ファイルの作成に競合状態はありません」と書かれていますか、それともGILが原因で私のケースは失敗しますか? これは、スレッドを 1 つだけ使用するとすべてがうまくいくためだと思われます。
誰かが私のエラーの手がかりを教えてくれますか? 私はしばらくの間、問題に苦しんでいます:(