2012-01-09 10 views
7

Tôi cần một thư mục tạm thời, nhưng tôi muốn toàn quyền kiểm soát việc tạo và xóa của nó.Thư mục tạm thời tồn tại trên các chương trình chạy

Tôi sẽ sử dụng thư mục này để đặt kho git mà tôi muốn theo dõi các cam kết mới, vì vậy tôi cần lưu trữ chúng ở đâu đó vĩnh viễn.

Vì vậy, tôi muốn tránh /tmp dir, vì nó có thể bị xóa bởi người dùng (?). Thực hành tốt nhất cho việc này là gì?

Trả lời

1

http://pypi.python.org/pypi/appdirs là mô-đun Python cung cấp chức năng user_cache_dir đa nền tảng.

+0

Wow, cảm ơn. Tôi đoán đây là con đường để đi. Tôi chỉ tự hỏi 'user_cache_dir' vs' site_data_dir', điều này phù hợp hơn với trường hợp của tôi. – umpirsky

8

tempfile.mkdtemp sẽ tạo một thư mục tạm thời cho bạn và trả lại tên của nó. Nó sẽ tạo ra nó trong /tmp theo mặc định (trên các hệ thống giống Unix), nhưng "theo cách an toàn nhất có thể" và với quyền đọc/ghi/danh sách chỉ cho id người dùng của người gọi.

>>> d = tempfile.mktemp() 
>>> with open(os.path.join(d, "secret")) as output: 
...  output.write("Ha, you can't read this!") 

(Btw., Trên một hệ thống Unix/Linux với các thiết lập mặc định, người dùng có thể không chỉ cần chỉnh sửa hay xóa những file của nhau từ /tmp.)

+0

Hehum, tôi đã xem xét điều này. Vì vậy, tôi không thể tin rằng một khi tempdir được tạo ra sẽ luôn ở đó? Ngoài ra, tôi cần nhớ một khi đã tạo đường dẫn dir và sử dụng nó trên mọi ứng dụng chạy, phải không? Bạn có khuyên bạn nên tạo một tmpdir cấp cao nhất cho tất cả các thư mục con của tôi (git repos) hoặc để tách riêng mỗi tempdir của riêng nó? Cảm ơn. – umpirsky

+0

@umpirsky: bạn có muốn thư mục tạm thời tồn tại trong suốt chương trình không? –

+0

Điều này rất có thể sẽ chỉ tạo một thư mục trong '/ tmp' là mặc định cho [' tempfile.tempdir'] (http://docs.python.org/library/tempfile.html#tempfile.tempdir). – sth

8

Tôi muốn nói rằng việc thực hành tốt nhất là sử dụng tempfile.mkdtemp.

Nếu bạn không wan để sử dụng /tmp sau đó, bạn có thể tận dụng lợi thế của prefix tham số:

import tempfile 
tempfile.mkdtemp(prefix=<your_preferred_directory>) 

Edit: Về những gì thư mục thích hợp nhất để sotre cấu hình ứng dụng, dữ liệu bộ nhớ cache, vv Nếu bạn đang sử dụng Linux, vui lòng xem XDG Base Directory Specification.

0

Thông thường, các chương trình sử dụng thư mục ~/.progname để lưu trữ dữ liệu phải kiên trì nhưng nên giữ nguyên "ngoài con đường" của người dùng.

2

Nếu nó thực sự là tạm thời, hãy làm theo lời khuyên của người bảo lãnh và sử dụng mkdtemp.

Nếu đó là một loại bộ nhớ cache bán vĩnh viễn phải tồn tại khởi động lại, thì bạn nên sử dụng thư mục ứng dụng cục bộ, như được định nghĩa bởi hệ điều hành của bạn (% APPDATA%, ~/.local/etc); một số bộ công cụ (ví dụ: Qt) cung cấp các chức năng để xem thư mục đó theo cách đa nền tảng.

Chỉnh sửa: từ Wikipedia:

  • CHỦ (Unix-like) và USERPROFILE (Microsoft Windows) - chỉ ra nơi thư mục home của người dùng nằm trong hệ thống tập tin.
  • HOME/{. AppName} (giống Unix) và APPDATA {DeveloperName \ AppName} (Microsoft Windows) - để lưu trữ cài đặt ứng dụng. Nhiều chương trình nguồn mở không chính xác sử dụng USERPROFILE cho cài đặt ứng dụng trong Windows - USERPROFILE chỉ được sử dụng trong hộp thoại cho phép người dùng chọn giữa các đường dẫn như Tài liệu/Ảnh/Tải/Nhạc, cho mục đích có lập trình sử dụng APPDATA (chuyển vùng), LocalAppData hoặc ProgramData (chia sẻ giữa người sử dụng)

Vì vậy, bạn nên tìm kiếm os.environ['APPDATA'] hoặc os.environ['HOME'], tùy thuộc vào nền tảng (xem sys.platform) và sau đó thêm tên ứng dụng của bạn, và sau đó bạn có thể lưu trữ có bất cứ điều gì bạn muốn.

mydir = os.path.join(".myAppName", "cache") 
homeVar = 'HOME' # default for all *nix variants 
if sys.platform == 'win32': 
    homeVar = 'APPDATA' 
mydir = os.path.join(os.environ[homeVar], mydir) 
0

Mặc dù: Bạn có thể muốn xem xét git commit hooks. Bằng cách đó, thay vì theo dõi một thư mục tmp cho các commit mới (âm thanh lạ: ai sẽ cam kết vào một thư mục tmp với các quyền hạn chế?) Repo thông báo cho bạn về các cam kết, hoặc, cụ thể hơn, tự động chạy một kịch bản bất cứ khi nào một cam kết xảy ra ..

+0

Tôi đang xây dựng một số loại màn hình git, sẽ thông báo về những thay đổi trong nhánh chính. Sth như githubs RSS feed. Để phát hiện các thay đổi, tôi cần tìm nạp repo ở đâu đó. Đó là lý do tại sao tôi cần tmp dir. Thx, – umpirsky

+0

Bạn sẽ không muốn có nó trong một thư mục thường xuyên sau đó, vì vậy bạn không phải sao chép toàn bộ repo mỗi khi bạn muốn kiểm tra thay đổi? – a2800276

+0

Vâng, có vẻ như tôi đặt câu hỏi của tôi sai, xin lỗi. – umpirsky