【问题标题】:What is a thread-specific os.chdir and mkdir in python?什么是 python 中特定于线程的 os.chdir 和 mkdir?
【发布时间】:2013-04-29 14:20:48
【问题描述】:

我有几个线程,每个线程都在更改工作目录,偶尔会在特定工作目录中创建新目录,在这些目录中复制/移动文件等。想想例如:

def thread1:
  while True:
    os.chdir('dir')
    os.mkdir('newdir')
    os.system('mv *.png newdir/')
    do something

def thread2:
  while True:
    os.chdir('another-dir')
    os.mkdir('another-newdir')
    os.system('mv *.png another-newdir/')
    do something

我读过 chdir、mkdir 函数不是特定于线程而是全局的。有什么方法可以做到这一点?我可以尝试使用绝对路径,但这是最好的解决方案吗?

【问题讨论】:

  • 解决这个问题的快速方法是永远不要打电话给os.chdir()。在您的情况下,它将变为os.mkdir('dir/newdir'); os.system('cd dir && mv *.png newdir/')。请注意,cd 在 shell 命令中。
  • 另一种解决方案——仅在 Linux 上——是使用 unshare(CLONE_FS) 函数,但这肯定需要编写 C 或使用 ctypes/cffi。

标签: python multithreading operating-system


【解决方案1】:

工作目录是进程的信息,因此所有线程共享同一个工作目录。如果您想使用多个线程,您必须使用绝对路径。

您可以使用os.path 模块轻松获取绝对路径。

您可能会考虑的另一件事是使用 python 的标准库进行复制而不是调用外部进程。

参见示例:

【讨论】:

  • 可能不是很有用,但在 Linux 上存在一个解决方案(在其他操作系统上不存在,并且不暴露于 Python AFAIK):请man mkdirat 了解更多信息。
  • @ArminRigo, mkdirat 是 POSIX。
  • @pilcrow:你是对的。此外,它已被添加到 Python 3.3 中,例如 os.open(..., dir_fd=fd)
  • @ArminRigo 我不知道mkdirat,但我仍然希望避免这样做并明确使用绝对路径。
【解决方案2】:

操作系统级别的当前工作目录通常是特定于进程的,而不是每个线程的。 (Linux:见unshare

Python 内部文件操作大多可以重写以使用os.path.join() 并避免使用chdir()

当这不可能时,例如对于不可更改的代码,对于RExec 类的沙箱执行,您可以提供一个虚拟的os 模块、open 函数等,它们在后台进行路径调整。

对于调用外部程序,您可以在 subprocess.Popen() 调用和好友中提供cwd=... 参数。

【讨论】:

    【解决方案3】:

    您也可以使用多个进程来解决问题,而不是使用多个线程。

    寻找os.fork()

    我有可在多个磁盘上运行的备份脚本,通过对每个磁盘使用一个进程,我可以确保所有磁盘上的磁盘利用率保持在 100%。

    还有很多其他的库可以以与线程池类似的方式管理进程池,我最喜欢的是concurrent 包。

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2018-06-24
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2011-07-08
      • 2019-02-18
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多