如何为threading.Thread和multiprocessing.Pool指定本地工作目录?

时间:2013-08-29 16:26:50

标签: python multiprocessing

就像subprocess.Popen(target =,cwd =)一样,它可以指定自己的本地工作目录。 我不想每次都指定绝对路径,因为简单比复杂更好。 os.chdir()根本不起作用,因为它设置了一个全局变量(对吧?)。只要有多个线程,os.chdir()就会失败。 有什么建议?谢谢!

我只是尝试jorgenkg的代码并进行一些修改,你可能会明白为什么我要问这个问题。这是代码。

import os
import threading
import time

class child(threading.Thread):
    def run(self ):
        for i in range(1,3):
            print "I am " + str(threading.current_thread())[7:15] + " in " + os.getcwd() + '\r\n'
            time.sleep(2)            


child().start() # prints "/username/path"


os.chdir('C://') # The process is changing directory
child().start() # prints "/"

以下是结果

I am Thread-1 in C:\Python27\Projects

I am Thread-2 in C:\



I am Thread-1 in C:\

I am Thread-2 in C:\

在调用os.chdir()之后,您可以看到Thread-2在其原始工作目录上的工作时间不长。

1 个答案:

答案 0 :(得分:4)

正如您所述,当前目录路径属于拥有线程的进程

创建线程之前

在初始化将共享os.getcwd()

的子线程之前,您必须设置路径

一个简单的代码示例:

import os
import threading
import time

class child(threading.Thread):
    def __init__(self, initpath=None):
        # initpath could be a string fed to many initializations

        time.sleep(0.05) # print() doesn't seem thread safe, this delays it.

        super(child, self).__init__()

        if initpath is not None:
            os.chdir(initpath)

    def run(self):
        print(os.getcwd())
        time.sleep(2)
        print("slept "+os.getcwd())  # These will all show the last path.

child().start() # Prints your initial path.

# Both print "/home/username/path/somefolder/".
child(initpath="/home/username/path/somefolder/").start() 
child().start()

os.chdir("/") # The process is changing directory
child().start() # prints "/"
  

如上所述,一旦目录发生变化,所有线程都会随之改变。因此,您不能跨多个线程同时使用os.chdir()