2013-05-05 16 views
5

Tôi có một vài chủ đề mà mỗi thư mục đang thay đổi thư mục làm việc và đôi khi tạo các thư mục mới trong các thư mục làm việc cụ thể, sao chép/di chuyển các tệp vv trong các thư mục này. Hãy suy nghĩ ví dụ:Một os.chdir và mkdir cụ thể theo chủ đề trong python là gì?

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 

Tôi đã đọc hàm chdir, mkdir không dành riêng cho chuỗi nhưng toàn cục. Một cách để thực hiện điều này là gì? Tôi có thể thử sử dụng đường dẫn tuyệt đối nhưng đó có phải là giải pháp tốt nhất không?

+1

Cách nhanh chóng để giải quyết nó là không bao giờ gọi '' os.chdir() ''. Trong trường hợp của bạn, nó sẽ trở thành '' os.mkdir ('dir/newdir'); os.system ('cd dir && mv * .png newdir /') ''. Lưu ý rằng '' cd'' nằm trong lệnh shell. –

+0

Một giải pháp khác - chỉ trên Linux-- là sử dụng chức năng 'unshare (CLONE_FS)', nhưng điều đó chắc chắn yêu cầu viết C hoặc sử dụng ctypes/cffi. –

Trả lời

5

Thư mục hoạt động là thông tin của quy trình , do đó tất cả các chuỗi đều chia sẻ cùng một thư mục làm việc. Bạn phải hoạt động với đường dẫn tuyệt đối nếu bạn muốn sử dụng nhiều chuỗi.

Bạn có thể có được đường dẫn tuyệt đối khá dễ dàng bằng mô-đun os.path.

Một điều khác mà bạn có thể xem xét là sử dụng thư viện chuẩn của python để thực hiện sao chép thay vì gọi các quy trình bên ngoài.

Xem ví dụ:

+0

Có lẽ không phải là rất hữu ích, nhưng tồn tại một giải pháp trên Linux (không tồn tại trên các hệ điều hành khác, và không được tiếp xúc với Python AFAIK): làm '' man mkdirat'' để tìm hiểu thêm. –

+0

@ArminRigo, [mkdirat] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html) là POSIX. – pilcrow

+0

@pilcrow: Bạn nói đúng. Ngoài ra, nó đã được thêm vào Python 3.3, nơi bạn có thể nói ví dụ 'os.open (..., dir_fd = fd)'. –

1

thư mục làm việc hiện tại ở cấp hệ điều hành thường là quy trình cụ thể, chứ không phải cho mỗi thread. (Linux: xem unshare)

Hoạt động của tệp nội bộ Python chủ yếu có thể được viết lại để sử dụng os.path.join() và tránh chdir().

Khi điều này là không thể, ví dụ: đối với mã không thay đổi, đối với RExec loại thực thi hộp cát hoặc như vậy, thì bạn có thể cung cấp một mô-đun os ảo, open chức năng, vv .. điều chỉnh đường dẫn đằng sau hậu trường.

Để gọi các chương trình bên ngoài, bạn có thể cung cấp đối số cwd=... trong các cuộc gọi con và bạn bè subprocess.Popen().

Các vấn đề liên quan