298
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Gần đây tôi nâng cấp Django từ v1.3.1 lên v1.4.
Trong os.path.dirname(path) 2 cũ của tôi, tôi có
TEMPLATE_DIRS = ( os.path.join(os.path.dirname( __file__ ), 'templates').replace('\\', '/'), # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. )Điều này sẽ chỉ ra os.path.dirname(path) 3, nhưng vì Django v1.4 đã chuyển thư mục dự án đến cùng cấp với các thư mục ứng dụng, tệp os.path.dirname(path) 2 của tôi hiện đang ở os.path.dirname(path) 5 thay vì os.path.dirname(path) 6.
Vì vậy, thực sự câu hỏi của tôi bây giờ là gấp đôi:
- Làm cách nào để sử dụng os.path.dirname(path) 7 để xem xét một cấp một cấp trên từ os.path.dirname(path) 8. Nói cách khác, tôi muốn os.path.dirname(path) 9 tìm os.path.dirname(path) 3 bằng cách sử dụng các đường dẫn tương đối.
- Tôi có nên giữ thư mục os.path.dirname(os.path.dirname(path)) 1 (có các mẫu ứng dụng chéo, như os.path.dirname(os.path.dirname(path)) 2, os.path.dirname(os.path.dirname(path)) 3, v.v.) ở cấp độ dự án os.path.dirname(os.path.dirname(path)) 4 hoặc tại os.path.dirname(os.path.dirname(path)) 5?
Đã hỏi ngày 24 tháng 3 năm 2012 lúc 23:41Mar 24, 2012 at 23:41
hobbes3hobbes3hobbes3
26.2K24 Huy hiệu vàng85 Huy hiệu bạc116 Huy hiệu đồng24 gold badges85 silver badges116 bronze badges
4
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates'))
Theo như thư mục mẫu nên đi, tôi không biết vì Django 1.4 vừa xuất hiện và tôi chưa nhìn vào nó. Bạn có lẽ nên hỏi một câu hỏi khác về SE để giải quyết vấn đề đó.
Bạn cũng có thể sử dụng os.path.dirname(os.path.dirname(path)) 6 để làm sạch đường dẫn, thay vì os.path.dirname(os.path.dirname(path)) 7. Tuy nhiên, trong tình huống này, Django mong đợi một con đường tuyệt đối hơn là một con đường tương đối.
Đối với khả năng tương thích của nền tảng chéo, hãy sử dụng os.path.dirname(os.path.dirname(path)) 8 thay vì os.path.dirname(os.path.dirname(path)) 9.
Đã trả lời ngày 24 tháng 3 năm 2012 lúc 23:48Mar 24, 2012 at 23:48
forivallforivallforivall
9.1202 Huy hiệu vàng32 Huy hiệu bạc58 Huy hiệu Đồng2 gold badges32 silver badges58 bronze badges
11
Để nhận thư mục của một tệp, chỉ cần sử dụng:
os.path.dirname(path)Để có được một thư mục, chỉ cần sử dụng lại if os.path.islink(__file__): path = os.readlink (__file__) 0
os.path.dirname(os.path.dirname(path))Bạn có thể muốn kiểm tra xem os.path.dirname(path) 8 có phải là symlink không:
if os.path.islink(__file__): path = os.readlink (__file__)
Đã trả lời ngày 24 tháng 3 năm 2012 lúc 23:49Mar 24, 2012 at 23:49
Jassinmjassinmjassinm
7.0733 Huy hiệu vàng32 Huy hiệu bạc42 Huy hiệu đồng3 gold badges32 silver badges42 bronze badges
2
Nếu bạn đang sử dụng Python 3.4 hoặc mới hơn, một cách thuận tiện để di chuyển nhiều thư mục là if os.path.islink(__file__): path = os.readlink (__file__) 2:
from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "."Đã trả lời ngày 25 tháng 7 năm 2018 lúc 17:01Jul 25, 2018 at 17:01
Birnbaumbirnbaumbirnbaum
4.37830 Huy hiệu bạc37 Huy hiệu đồng30 silver badges37 bronze badges
1
Bạn muốn chính xác điều này:
BASE_DIR = os.path.join( os.path.dirname( __file__ ), '..' )Đã trả lời ngày 7 tháng 9 năm 2012 lúc 1:36Sep 7, 2012 at 1:36
Alan Viarsalan ViarsAlan Viars
2.95229 Huy hiệu bạc14 Huy hiệu đồng29 silver badges14 bronze badges
Cá nhân, tôi sẽ đi theo cách tiếp cận chức năng
def get_parent_dir(directory): import os return os.path.dirname(directory) current_dirs_parent = get_parent_dir(os.getcwd())Đã trả lời ngày 22 tháng 4 năm 2014 lúc 17:25Apr 22, 2014 at 17:25
Lord Sumnerlord SumnerLord Sumner
5144 Huy hiệu bạc5 Huy hiệu Đồng4 silver badges5 bronze badges
2
Tôi nghĩ rằng điều dễ nhất phải làm chỉ là sử dụng lại dirname () để bạn có thể gọi
os.path.dirname(os.path.dirname( __file__ ))Nếu bạn tệp đang ở /users/hobbes3/sites/mysite/templates/method.py
Điều này sẽ trả về "/user/hobbes3/site/mysite"
Đã trả lời ngày 16 tháng 11 năm 2015 lúc 19:47Nov 16, 2015 at 19:47
Nếu bạn thích một lớp lót để lấy thư mục cha mẹ, tôi sẽ đề xuất điều này:
import os parent_dir = os.path.split(os.getcwd())[0]Phương pháp if os.path.islink(__file__): path = os.readlink (__file__) 3 Trả về một tuple (đầu, đuôi) trong đó đuôi là tất cả sau khi chém cuối cùng. Vì vậy, chỉ mục đầu tiên là cha mẹ của con đường tuyệt đối của bạn.
Đã trả lời ngày 12 tháng 5 năm 2021 lúc 18:57May 12, 2021 at 18:57
Carlosggcarlosggcarlosgg
891 Huy hiệu bạc3 Huy hiệu đồng1 silver badge3 bronze badges
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 0
Update:
Nếu bạn tình cờ "Sao chép" os.path.dirname(path) 2 thông qua SymLinking, câu trả lời của Forivall sẽ tốt hơn:
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 1Phương thức trên sẽ 'xem' if os.path.islink(__file__): path = os.readlink (__file__) 5 trong khi phương thức của @forivall sẽ thấy if os.path.islink(__file__): path = os.readlink (__file__) 6
Trong sự vắng mặt của các liên kết symlink, hai câu trả lời là giống hệt nhau.
Đã trả lời ngày 21 tháng 1 năm 2013 lúc 10:23Jan 21, 2013 at 10:23
Antony Hatchkinsantony HatchkinsAntony Hatchkins
29,8K9 Huy hiệu vàng106 Huy hiệu bạc108 Huy hiệu Đồng9 gold badges106 silver badges108 bronze badges
2
Điều này có thể hữu ích cho các trường hợp khác mà bạn muốn đi x thư mục. Chỉ cần chạy if os.path.islink(__file__): path = os.readlink (__file__) 7 để đi lên 6 thư mục.
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 2Đã trả lời ngày 23 tháng 8 năm 2016 lúc 9:32Aug 23, 2016 at 9:32
1
Đi lên một cấp độ từ thư mục công việc
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 3hoặc từ thư mục hiện tại
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 4Đã trả lời ngày 24 tháng 8 năm 2020 lúc 11:00Aug 24, 2020 at 11:00
Để đi if os.path.islink(__file__): path = os.readlink (__file__) 8 thư mục lên ... chạy if os.path.islink(__file__): path = os.readlink (__file__) 9
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 5Đã trả lời ngày 24 tháng 4 năm 2019 lúc 12:58Apr 24, 2019 at 12:58
Jo3lJo3lJo3l
Phù hiệu bằng đồng 3133 bronze badges
Tôi ngạc nhiên khi xử lý một số lượng mã thông báo thư mục phụ huynh tùy ý ".." trong chuỗi đường dẫn không được xử lý trực tiếp bởi thư viện HĐH. Đây là một chức năng nhanh chóng và bẩn thỉu sẽ cung cấp cho bạn một chuỗi đường dẫn tuyệt đối từ một chuỗi tương đối:
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 6Bạn có thể gọi nó với Open () như thế này:
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 7Đã trả lời ngày 1 tháng 3 năm 2021 lúc 1:24Mar 1, 2021 at 1:24
Đối với một người hoang tưởng như tôi, tôi thích cái này hơn
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 8
serv-inc
33,8K9 Huy hiệu vàng149 Huy hiệu bạc177 Huy hiệu đồng9 gold badges149 silver badges177 bronze badges
Đã trả lời ngày 16 tháng 7 năm 2013 lúc 16:08Jul 16, 2013 at 16:08
1
Với việc sử dụng os.path.dirname(path) 7, chúng ta có thể đi lên một thư mục như thế
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 9Ngoài ra sau khi tìm thấy thư mục bạn muốn, bạn có thể tham gia với các tệp/thư mục khác
os.path.dirname(path) 0Đã trả lời ngày 9 tháng 6 năm 2020 lúc 21:27Jun 9, 2020 at 21:27
Abdullahselekabdullahselekabdullahselek
7.5553 Huy hiệu vàng45 Huy hiệu bạc37 Huy hiệu đồng3 gold badges45 silver badges37 bronze badges
Tất nhiên: chỉ cần sử dụng from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 1.
Wai Ha Lee
8.30873 Huy hiệu vàng59 Huy hiệu bạc88 Huy hiệu đồng73 gold badges59 silver badges88 bronze badges
Đã trả lời ngày 30 tháng 4 năm 2019 lúc 23:22Apr 30, 2019 at 23:22
Shwarmedy ShwarmaThe Shwarma
Phù hiệu bằng đồng 1801 màu bạc111 silver badge11 bronze badges
1
Từ đường dẫn tệp hiện tại bạn có thể sử dụng:
os.path.dirname(path) 1Đã trả lời ngày 1 tháng 9 năm 2020 lúc 15:19Sep 1, 2020 at 15:19
Không phải là một câu trả lời mà là một nhận xét tiếp tuyến dài mà có lẽ nên được đưa ra như ai đó có thể bị dẫn dắt lạc lối ...
Cú pháp from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 2 Để có được một tệp trong cùng một thư mục với tệp Python đang chạy không phải là giải pháp "được khuyên" cho các gói, thay vào đó là dữ liệu gói được ưu tiên vì một vài lý do, ví dụ như trong gói đóng gói zip hoặc hệ thống tập tin phức tạp hơn .
from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 3 là giải pháp được đề xuất trước đây, nhưng sẽ bị loại bỏ tại một số điểm và from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 4 là cách được đề xuất. Tuy nhiên, điều này
- Yêu cầu from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 5 và from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 6 với from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 7 trong tệp from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 8
- yêu cầu from pathlib import Path full_path = "path/to/directory" str(Path(full_path).parents[0]) # "path/to" str(Path(full_path).parents[1]) # "path" str(Path(full_path).parents[2]) # "." 9 nếu PIP phân phối dưới dạng SDIST (nhưng không phải là bánh xe được xây dựng)
- sẽ không hoạt động để nhập khẩu tương đối (nghĩa là chưa được cài đặt)
- là một cách khôn ngoan và thường bị bỏ qua vì sự tỉnh táo trong các ứng dụng web do cách họ chạy
Đã trả lời ngày 17 tháng 1 lúc 15:20Jan 17 at 15:20
Matteo Ferlamatteo FerlaMatteo Ferla
1.7781 Huy hiệu vàng14 Huy hiệu bạc25 Huy hiệu Đồng1 gold badge14 silver badges25 bronze badges