ใน Python 3.4 และใหม่กว่าคุณสามารถนำเข้าจากไฟล์ต้นฉบับโดยตรง (ลิงก์ไปยังเอกสารประกอบ)(เชื่อมโยงไปยังเอกสาร) นี่ไม่ใช่ทางออกที่ง่ายที่สุด แต่ฉันรวมคำตอบนี้เพื่อความครบถ้วนสมบูรณ์
นี่คือตัวอย่าง ก่อนไฟล์ที่จะนำเข้าชื่อfoo.py
:
def announce():
print("Imported!")
รหัสที่นำเข้าไฟล์ด้านบนเป็นแรงบันดาลใจอย่างมากจากตัวอย่างในเอกสารประกอบ:
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()
ผลลัพธ์:
<module 'foo' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
โปรดทราบว่าชื่อตัวแปรชื่อโมดูลและชื่อไฟล์ไม่จำเป็นต้องตรงกัน รหัสนี้ยังใช้งานได้:
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()
ผลลัพธ์:
<module 'bar' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
โมดูลการนำเข้าแบบโปรแกรมได้รับการแนะนำใน Python 3.1 และให้คุณควบคุมวิธีการนำเข้าโมดูล อ้างถึงเอกสารประกอบสำหรับข้อมูลเพิ่มเติม