Có một vấn đề với mọi câu trả lời được cung cấp có thể được tóm tắt là "chỉ cần thêm câu thần chú kỳ diệu này vào đầu tập lệnh của bạn. Xem bạn có thể làm gì chỉ với một hoặc hai dòng mã". Chúng sẽ không hoạt động trong mọi tình huống có thể xảy ra!
Ví dụ, một câu thần chú kỳ diệu như vậy sử dụng tệp . Thật không may, nếu bạn đóng gói tập lệnh của mình bằng cx_Freeze hoặc bạn đang sử dụng IDLE, điều này sẽ dẫn đến một ngoại lệ.
Một câu thần chú kỳ diệu khác như vậy sử dụng os.getcwd (). Điều này sẽ chỉ hoạt động nếu bạn đang chạy tập lệnh của mình từ dấu nhắc lệnh và thư mục chứa tập lệnh của bạn là thư mục làm việc hiện tại (tức là bạn đã sử dụng lệnh cd để thay đổi thành thư mục trước khi chạy tập lệnh). Ơ trời! Tôi hy vọng tôi không phải giải thích lý do tại sao điều này sẽ không hoạt động nếu tập lệnh Python của bạn nằm trong PATH ở đâu đó và bạn đã chạy nó bằng cách chỉ cần gõ tên tệp tập lệnh của mình.
May mắn thay, có một câu thần chú kỳ diệu sẽ hoạt động trong tất cả các trường hợp tôi đã thử nghiệm. Thật không may, câu thần chú kỳ diệu không chỉ là một hoặc hai dòng mã.
import inspect
import os
import sys
# Add script directory to sys.path.
# This is complicated due to the fact that __file__ is not always defined.
def GetScriptDirectory():
if hasattr(GetScriptDirectory, "dir"):
return GetScriptDirectory.dir
module_path = ""
try:
# The easy way. Just use __file__.
# Unfortunately, __file__ is not available when cx_freeze is used or in IDLE.
module_path = __file__
except NameError:
if len(sys.argv) > 0 and len(sys.argv[0]) > 0 and os.path.isabs(sys.argv[0]):
module_path = sys.argv[0]
else:
module_path = os.path.abspath(inspect.getfile(GetScriptDirectory))
if not os.path.exists(module_path):
# If cx_freeze is used the value of the module_path variable at this point is in the following format.
# {PathToExeFile}\{NameOfPythonSourceFile}. This makes it necessary to strip off the file name to get the correct
# path.
module_path = os.path.dirname(module_path)
GetScriptDirectory.dir = os.path.dirname(module_path)
return GetScriptDirectory.dir
sys.path.append(os.path.join(GetScriptDirectory(), "lib"))
print(GetScriptDirectory())
print(sys.path)
Như bạn thấy, đây không phải là nhiệm vụ dễ dàng!