12

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

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 函数不是特定于线程而是全局的。有什么方法可以做到这一点?我可以尝试使用绝对路径,但这是最好的解决方案吗?

4

3 回答 3

9

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

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

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

参见例如:

于 2013-05-05T19:57:30.007 回答
3

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

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

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

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

于 2017-05-11T13:52:51.370 回答
1

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

寻找os.fork()

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

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

于 2021-02-09T22:35:17.107 回答