ฉันต้องการนำเข้า foo-bar.py งานนี้:
foobar = __import__("foo-bar")
สิ่งนี้ไม่:
from "foo-bar" import *
คำถามของฉัน: มีวิธีใดบ้างที่ฉันสามารถใช้รูปแบบข้างต้นเช่นfrom "foo-bar" import *
เพื่อนำเข้าโมดูลที่มี-
ในนั้น
ฉันต้องการนำเข้า foo-bar.py งานนี้:
foobar = __import__("foo-bar")
สิ่งนี้ไม่:
from "foo-bar" import *
คำถามของฉัน: มีวิธีใดบ้างที่ฉันสามารถใช้รูปแบบข้างต้นเช่นfrom "foo-bar" import *
เพื่อนำเข้าโมดูลที่มี-
ในนั้น
คำตอบ:
คุณทำไม่ได้ foo-bar
ไม่ใช่ตัวบ่งชี้ เปลี่ยนชื่อไฟล์เป็นfoo_bar.py
แก้ไข:หากimport
ไม่ใช่เป้าหมายของคุณ (เช่น: คุณไม่สนใจว่าจะเกิดอะไรขึ้นsys.modules
คุณไม่จำเป็นต้องนำเข้าเอง) เพียงแค่ทำให้กลมทั้งหมดของไฟล์เข้าสู่ขอบเขตของคุณเองคุณสามารถใช้execfile
# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>>
execfile(fn)
ใช้exec(open(fn).read())
ยังมีแพ็คเกจ importlib
หากคุณไม่สามารถเปลี่ยนชื่อโมดูลให้ตรงกับหลักการตั้งชื่อของ Python ให้สร้างโมดูลใหม่เพื่อทำหน้าที่เป็นตัวกลาง:
---- foo_proxy.py ----
tmp = __import__('foo-bar')
globals().update(vars(tmp))
---- main.py ----
from foo_proxy import *
foo_proxy.py
ไฟล์กำหนดผลลัพธ์ของการ__import__(...)
sys.modules['foo_proxy']
จริงๆแล้วอย่าทำอย่างนั้นมันเป็นความคิดที่แย่มาก
เริ่มต้นจาก Python 3.1 คุณสามารถใช้ importlib:
import importlib
foobar = importlib.import_module("foo-bar")
หากคุณไม่สามารถเปลี่ยนชื่อไฟล์ต้นฉบับคุณสามารถใช้ symlink:
ln -s foo-bar.py foo_bar.py
จากนั้นคุณสามารถ:
from foo_bar import *
เช่นเดียวกับที่คนอื่นพูดว่าคุณไม่สามารถใช้ "-" ในการตั้งชื่องูเหลือมมีวิธีแก้ปัญหาหลายวิธีหนึ่งวิธีแก้ปัญหาดังกล่าวซึ่งจะมีประโยชน์ถ้าคุณต้องเพิ่มหลายโมดูลจากเส้นทางที่ใช้ sys.path
ตัวอย่างเช่นถ้าโครงสร้างของคุณเป็นเช่นนี้:
foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')
import barfoo