首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows PermissionError & tempfile模块

Windows PermissionError & tempfile模块
EN

Stack Overflow用户
提问于 2018-12-11 14:12:48
回答 1查看 462关注 0票数 1

在测试期间,我们使用tempfile模块生成临时文件&dir。我们最近也开始在Windows上进行测试,并遇到了一堆PermissionErrors。

我最初认为这可能是因为Windows与Unix不同,它不允许同时访问文件。当我查看代码时,即使没有同时访问文件,也会发生这种情况。

一个常见的线程似乎是当我们在上下文中使用tempfile模块的结构时发生的错误(带语句)。当我们使用手动尝试--除了--最后,错误就消失了。

我正在研究解决这个问题的方法,上面提到的尝试--除了--最终也摆在了桌面上。

还有其他人遇到过这种情况或者有什么见解吗?

这是我们的测试功能(nosetest,但我不认为这是问题所在)

代码语言:javascript
复制
from nibabel.tmpdirs import InTemporaryDirectory
def test_high_level_glm_with_data():
    with InTemporaryDirectory():
        shapes, rk = ((7, 8, 7, 15), (7, 8, 7, 16)), 3
        mask, fmri_data, design_matrices = write_fake_fmri_data(shapes, rk)
        multi_session_model = FirstLevelModel(mask=mask).fit(
            fmri_data, design_matrices=design_matrices)
        z_image = multi_session_model.compute_contrast(
            np.eye(rk)[:2], output_type='z_score')
        variance_image = multi_session_model.compute_contrast(
            np.eye(rk)[:2], output_type='effect_variance')

        assert_array_equal(z_image.get_data() == 0., load(mask).get_data() == 0.)  # no error
        assert_true(
            (variance_image.get_data()[load(mask).get_data() > 0] > .001).all())  # error

这是回溯:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Users\kshit\AppData\Local\conda\conda\envs\nistats-py37-latest\lib\site-packages\nose\case.py", line 197, in runTest
    self.test(*self.arg)
  File "C:\Users\kshit\OneDrive\workspace\nistats-org\nistats-repo\kchawla-pi\nistats\nistats\tests\test_first_level_model.py", line 104, in test_high_level_glm_with_data
    (variance_image.get_data()[load(mask).get_data() > 0] > .001).all())
  File "C:\Users\kshit\AppData\Local\conda\conda\envs\nistats-py37-latest\lib\site-packages\nibabel\tmpdirs.py", line 76, in __exit__
    return super(InTemporaryDirectory, self).__exit__(exc, value, tb)
  File "C:\Users\kshit\AppData\Local\conda\conda\envs\nistats-py37-latest\lib\site-packages\nibabel\tmpdirs.py", line 48, in __exit__
    self.cleanup()
  File "C:\Users\kshit\AppData\Local\conda\conda\envs\nistats-py37-latest\lib\site-packages\nibabel\tmpdirs.py", line 44, in cleanup
    shutil.rmtree(self.name)
  File "C:\Users\kshit\AppData\Local\conda\conda\envs\nistats-py37-latest\lib\shutil.py", line 507, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Users\kshit\AppData\Local\conda\conda\envs\nistats-py37-latest\lib\shutil.py", line 391, in _rmtree_unsafe
    onerror(os.unlink, fullname, sys.exc_info())
  File "C:\Users\kshit\AppData\Local\conda\conda\envs\nistats-py37-latest\lib\shutil.py", line 389, in _rmtree_unsafe
    os.unlink(fullname)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\kshit\\AppData\\Local\\Temp\\tmpbmgjqk03\\mask.nii'

如果我不使用with InTemporaryDir():,那么测试就能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-17 13:15:47

nibabel.tmpdirs.InTemporaryDirectory替换为Python的tempfile.TemporaryDirectory解决了这个问题。

也许Nibabel的版本没有在清理之前关闭文件?不知道这是怎么回事,这解决了我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53725979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档