Trong Python 3.4 trở lên, bạn có thể nhập trực tiếp từ tệp nguồn [liên kết đến tài liệu]. Đây không phải là giải pháp đơn giản nhất, nhưng tôi bao gồm câu trả lời này cho sự hoàn chỉnh.
Đây là một ví dụ. Đầu tiên, tệp được nhập, được đặt tên là
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
1:def announce[]:
print["Imported!"]
Mã nhập tệp ở trên, được truyền cảm hứng rất nhiều bởi ví dụ trong tài liệu:
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
Đầu ra:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
Lưu ý rằng tên biến, tên mô -đun và tên tệp không cần phải khớp. Mã này vẫn hoạt động:
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
baz = module_from_file["bar", "/path/to/foo.py"]
if __name__ == "__main__":
print[baz]
print[dir[baz]]
baz.announce[]
Đầu ra:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
Lưu ý rằng tên biến, tên mô -đun và tên tệp không cần phải khớp. Mã này vẫn hoạt động:
Các mô -đun chỉ đơn giản là một tệp python .py mà chúng ta có thể sử dụng các chức năng, lớp, biến trong một tệp khác. Để sử dụng những thứ này trong một tệp khác, trước tiên chúng ta cần nhập mô -đun đó vào tệp đó. Nếu mô -đun tồn tại trong cùng một thư mục với tệp, chúng ta có thể trực tiếp nhập nó bằng cách sử dụng cú pháp nhập mô -đun_name. Nhưng nếu nó tồn tại trong một thư mục khác, chúng ta không thể trực tiếp nhập nó. Trong bài viết này, chúng tôi sẽ thảo luận về nhiều cách khác nhau trong đó các mô -đun có thể được nhập từ bên ngoài thư mục.
Cây thư mục của chúng tôi sẽ như sau:
D :\projects\base |__main.py |__app: |__modules |___mod.py
Chúng tôi có một thư mục có tên ‘cơ sở trong các dự án D: \ và trong thư mục cơ sở, chúng tôi có một thư mục có tên là ứng dụng. Thư mục cơ sở chứa main.py mà chúng tôi sẽ nhập mô -đun. Thư mục ứng dụng chứa một thư mục khác có tên các mô -đun chứa mod.py là mô -đun cần được nhập.
Chúng tôi sẽ giữ mã của cả hai tệp đơn giản nhất có thể để giải thích tốt hơn:
mod.py:
Python
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
2 import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
3import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
4import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
5import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
6import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
7import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
8Bây giờ chúng tôi sẽ nhập mô -đun mod.py và gọi chức năng của nó xin chào trong main.py bằng các phương thức khác nhau. & Nbsp;
Phương pháp 1: Sử dụng sys.path.append []
Biến sys.path của mô -đun SYS chứa danh sách tất cả các thư mục trong đó Python sẽ tìm kiếm một mô -đun để nhập. Chúng ta có thể trực tiếp gọi phương pháp này để xem các thư mục mà nó chứa. Vì vậy, để nhập mod.py trong main.py, chúng tôi sẽ nối đường dẫn của mod.py trong sys.path để nhập các tìm kiếm python mod.py trong các thư mục của nó và tìm thấy nó để nhập thành công. Mã cho phương pháp này sẽ là:
Python
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
2 import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
3
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
1
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
2
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
3Bây giờ chúng tôi sẽ nhập mô -đun mod.py và gọi chức năng của nó xin chào trong main.py bằng các phương thức khác nhau. & Nbsp;
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
6Output:
hello geeks!
Phương pháp 1: Sử dụng sys.path.append []
Biến sys.path của mô -đun SYS chứa danh sách tất cả các thư mục trong đó Python sẽ tìm kiếm một mô -đun để nhập. Chúng ta có thể trực tiếp gọi phương pháp này để xem các thư mục mà nó chứa. Vì vậy, để nhập mod.py trong main.py, chúng tôi sẽ nối đường dẫn của mod.py trong sys.path để nhập các tìm kiếm python mod.py trong các thư mục của nó và tìm thấy nó để nhập thành công. Mã cho phương pháp này sẽ là:
Python
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
2 import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
3
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
9import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
baz = module_from_file["bar", "/path/to/foo.py"]
if __name__ == "__main__":
print[baz]
print[dir[baz]]
baz.announce[]
0import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
baz = module_from_file["bar", "/path/to/foo.py"]
if __name__ == "__main__":
print[baz]
print[dir[baz]]
baz.announce[]
1
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
2
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
3Bây giờ chúng tôi sẽ nhập mô -đun mod.py và gọi chức năng của nó xin chào trong main.py bằng các phương thức khác nhau. & Nbsp;
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
6Output:
hello geeks!
Phương pháp 1: Sử dụng sys.path.append []
Biến sys.path của mô -đun SYS chứa danh sách tất cả các thư mục trong đó Python sẽ tìm kiếm một mô -đun để nhập. Chúng ta có thể trực tiếp gọi phương pháp này để xem các thư mục mà nó chứa. Vì vậy, để nhập mod.py trong main.py, chúng tôi sẽ nối đường dẫn của mod.py trong sys.path để nhập các tìm kiếm python mod.py trong các thư mục của nó và tìm thấy nó để nhập thành công. Mã cho phương pháp này sẽ là:
D :\projects\base |__main.py |__app: | |__modules | |___mod.py | |___init__.py |__main.py
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
9
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
0Python
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
2 import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
3import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
baz = module_from_file["bar", "/path/to/foo.py"]
if __name__ == "__main__":
print[baz]
print[dir[baz]]
baz.announce[]
9Output:
hello geeks!
Bây giờ chúng tôi sẽ nhập mô -đun mod.py và gọi chức năng của nó xin chào trong main.py bằng các phương thức khác nhau. & Nbsp;
Phương pháp 1: Sử dụng sys.path.append []
Python
import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
2 import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
foo = module_from_file["foo", "/path/to/foo.py"]
if __name__ == "__main__":
print[foo]
print[dir[foo]]
foo.announce[]
3Bây giờ chúng tôi sẽ nhập mô -đun mod.py và gọi chức năng của nó xin chào trong main.py bằng các phương thức khác nhau. & Nbsp;
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
5
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
6import importlib.util
def module_from_file[module_name, file_path]:
spec = importlib.util.spec_from_file_location[module_name, file_path]
module = importlib.util.module_from_spec[spec]
spec.loader.exec_module[module]
return module
baz = module_from_file["bar", "/path/to/foo.py"]
if __name__ == "__main__":
print[baz]
print[dir[baz]]
baz.announce[]
1
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
8
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
9Phương pháp 1: Sử dụng sys.path.append []
D :\projects\base |__main.py |__app: |__modules |___mod.py3
D :\projects\base |__main.py |__app: |__modules |___mod.py4
Output:
hello geeks!