热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tempfile.TemporaryDirectorycontextmanager不使用/tmp文件夹

我将tempfile.TemporaryDirectory类用作上下文管理器。默认情况下,它应使用tmp

我将tempfile.TemporaryDirectory类用作上下文管理器。默认情况下,它应使用/tmp文件夹。我尝试使用默认值,也尝试强制使用/tmp文件夹。它会在调用者脚本所在的位置创建临时文件夹。

设置:


  • Red Hat 7 Linux

  • Python 3.6.6

  • 该脚本是从詹金斯调用的

代码:

import tempfile
import os
print(os.path.dirname(__file__))
TMP_DIR_PREFIX = "my_test_"
with tempfile.TemporaryDirectory(prefix=TMP_DIR_PREFIX,dir="/tmp") as tmp_dir:
print(tmp_dir)

输出:

>>> python3 /home/my_home/test.py
home/my_home
home/my_home/my_test_m1vljq2h

我的问题:


  • 有人知道我该怎么解决吗?


  • 怎么可能?我已经检查了TemporaryDirectory类的实现,但是看不到任何原因。如果有人能够解释其原因,我将非常高兴。


我已经阅读了相关的官方文档以及tempfile模块的实现,但是我没有找到任何可能导致此类问题的相关代码部分。

注意::如果可能的话,我不想继承和更改此模块的许多元素,但是我愿意接受。

编辑:

完成追溯(从运行Jenkins):

File "/my_path/python/3.6.0/lib/python3.6/threading.py",line 916,in _bootstrap_inner
self.run()
File "/my_path/python/3.6.0/lib/python3.6/threading.py",line 864,in run
self._target(*self._args,**self._kwargs)
File "/home/my_home/copy_to_location.py",line 143,in upload_files
with tempfile.TemporaryDirectory(prefix=TMP_DIR_PREFIX,dir="/tmp") as tmp_dir:
File "/my_path/python/3.6.0/lib/python3.6/tempfile.py",line 790,in __init__
self.name = mkdtemp(suffix,prefix,dir)
File "/my_path/python/3.6.0/lib/python3.6/tempfile.py",line 368,in mkdtemp
_os.mkdir(file,0o700)
PermissionError: [Errno 13] Permission denied: '/home/my_home/my_test_q1pldmf2'

EDIT2:

我无法在本地复制它。这个问题只会在詹金斯不断发生!

EDIT3:

添加的行:

logging.info(tempfile._sanitize_params("my_test_",None,None))

Jenkins的输出:

2019-11-08 15:09:26 [Thread-1] [INFO] ('my_test_','','/tmp',)

换行:

logging.info(tempfile._sanitize_params("my_test_","/tmp"))

在詹金斯中添加:

2019-11-08 15:13:46 [Thread-1] [INFO] ('my_test_',)


tempfile.TemporaryDirectory()对象使用tempfile.mkdtemp()根据传入的参数创建临时目录。如果您不给它{{1 }}参数。

如果您传递的是dir still ,但看不到在dir='/tmp'中创建的目录,则有两种可能性:


  • 您的/tmp值不是您认为的,而是以prefix
  • 开头
  • 系统上的/模块 已被更改,并且不再具有与tempfile.gettempdir()相同的方式。这些更改可能是在磁盘上进行的,也可能是通过其他Python代码动态更改了行为。

正常的行为是tempfile函数调用名为standard library version distributed with Python 3.6.0的内部函数,如果设置,则返回mkdtemp()不变,否则返回dir的值:

gettempdir()

>>> import tempfile
>>> tempfile._sanitize_params('my_test_',None,'/tmp')
('my_test_','','/tmp',)
>>> tempfile._sanitize_params('my_test_',None)
('my_test_',)
>>> tempfile.gettempdir()
'/tmp'
然后使用该调用的结果(返回更新的mkdtemp()prefixsuffixdirbytes类型)和随机字符串一起为您创建一个新目录。

这可能导致您没有正确排除str值确实是您认为的那样。 prefix函数使用:

mkdtemp()

通过前缀,候选值os.path.join(dir,prefix + name + suffix)
(随机值)和后缀(您的情况下为空字符串)的连接来加入dir路径。但是请注意,_sanitize_params()丢弃以name开头的参数之前的所有路径元素

/

因此,您看到的行为也可以由以斜杠开头的前缀来解释,所以:

>>> import os.path
>>> os.path.join("/foo","bar")
'/foo/bar'
>>> os.path.join("/foo","/bar")
'/bar'

将立即产生相同的结果:

TMP_DIR_PREFIX = "/home/my_home/my_test_"

这以前是作为os.path.join() function报告给Python项目的。

您可以在詹金斯(Jenkins)工作中平凡地包含两个测试,以排除这些选项。确保记录>>> TMP_DIR_PREFIX = "/home/my_home/my_test_"
>>> tempfile.mkdtemp(prefix=TMP_DIR_PREFIX,dir="/tmp")
Traceback (most recent call last):
File "",line 1,in
File "/.../lib/python3.6/tempfile.py",line 368,in mkdtemp
_os.mkdir(file,0o700)
PermissionError: [Errno 13] Permission denied: '/home/my_home/my_test_v4cqpamm'
值以及TMP_DIR_PREFIX返回的值。

如果任何一个都不在您的系统上产生预期的输出,那么您知道您需要专注于寻找; tempfile._sanitize_params(TMP_DIR_PREFIX,'/tmp')模块的行为已更改,或者您假设tempfile的值不正确。

您可以使用以下shell命令检查本地副本是否与发布版本不同:

TMP_DIR_PREFIX

或者您可以计算文件的校验和:

$ diff -u \
> <(curl -s https://raw.githubusercontent.com/python/cpython/v3.6.0/Lib/tempfile.py) \
> /my_path/python/3.6.0/lib/python3.6/tempfile.py

并将该校验和值与已发布文件的校验和值进行比较:

import hashlib
with open(tempfile.__file__,'rb') as file_to_hash:
tempfile_checksum = hashlib.sha1(file_to_hash.read()).hexdigest()

如果仍然无法执行任何操作,则可以通过调试器逐步完成调用,也可以查看所涉及函数的$ curl -s https://raw.githubusercontent.com/python/cpython/v3.6.0/Lib/tempfile.py | \
> sha1sum
38ad01ccc5972e193e1b96a1de8b7ba1bd8d289d -
属性。例如。例如,如果__module__是动态更改的(猴子修补),则_sanitize_params()将不会设置为tempfile._sanitize_params.__module__。但是,请注意,您的回溯已经显示'tempfile'TemporaryDirectory.__init__均来自正确的文件,并且可见的两行的行号与发布的源中的行号相匹配。


推荐阅读
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • 文件路径的生成及其在文件操作中的应用
    本文介绍了文件路径的生成方法及其在文件操作中的应用。在进行文件操作时,需要知道文件的具体位置才能打开文件。文件的位置有绝对路径和相对路径之分。绝对路径通常只在特定电脑上有效,不同电脑上的文件存放路径可能不同,导致程序报错。相对路径是解决这个问题的最好方式,它不依赖于文件的具体存放位置,只需要按照统一的规范进行文件存放即可。使用相对路径可以避免冗余和麻烦,特别适用于大项目和团队维护代码的情况。 ... [详细]
  • 使用Spring AOP实现切面编程的步骤和注意事项
    本文介绍了使用Spring AOP实现切面编程的步骤和注意事项。首先解释了@EnableAspectJAutoProxy、@Aspect、@Pointcut等注解的作用,并介绍了实现AOP功能的方法。然后详细介绍了创建切面、编写测试代码的过程,并展示了测试结果。接着讲解了关于环绕通知的使用方法,并修改了FirstTangent类以添加环绕通知方法。最后介绍了利用AOP拦截注解的方法,只需修改全局切入点即可实现。使用Spring AOP进行切面编程可以方便地实现对代码的增强和拦截。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
author-avatar
金豪情圣
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有