วิธีการนำเข้าโมดูลเมื่อชื่อโมดูลมีเครื่องหมาย '-' หรือขีดกลางอยู่ในนั้น


195

ฉันต้องการนำเข้า foo-bar.py งานนี้:

foobar = __import__("foo-bar")

สิ่งนี้ไม่:

from "foo-bar" import *

คำถามของฉัน: มีวิธีใดบ้างที่ฉันสามารถใช้รูปแบบข้างต้นเช่นfrom "foo-bar" import *เพื่อนำเข้าโมดูลที่มี-ในนั้น


10
ทำไมคุณถึงมีโมดูลที่มีเส้นประในชื่อของมัน
Matti Virkkunen

23
ฉันเดาว่าเดิมเขียนเป็นสคริปต์แทนที่จะเป็นโมดูล
Michael Hoffman


@MattiVirkkunen makepy.py ของ win32com จะสร้างโมดูลที่มีเส้นประในนั้น เลวร้ายเกินไป. comtypes แก้ไขสิ่งนี้โดยแปลงให้เป็นเครื่องหมายขีดล่าง
swdev

2
@MattiVirkkunen ฉันคิดว่า Python ไม่ควร จำกัด ชื่อที่ฉันจะให้ไดเรกทอรีของฉัน มันไม่รับผิดชอบที่จะทำเช่นนั้น
Zelphir Kaltstahl

คำตอบ:


117

คุณทำไม่ได้ foo-barไม่ใช่ตัวบ่งชี้ เปลี่ยนชื่อไฟล์เป็นfoo_bar.py

แก้ไข:หากimportไม่ใช่เป้าหมายของคุณ (เช่น: คุณไม่สนใจว่าจะเกิดอะไรขึ้นsys.modulesคุณไม่จำเป็นต้องนำเข้าเอง) เพียงแค่ทำให้กลมทั้งหมดของไฟล์เข้าสู่ขอบเขตของคุณเองคุณสามารถใช้execfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 

24
Python 3.x มีอะไรใหม่ใน Python 3.0ลบไฟล์ execfile () แทนที่จะexecfile(fn)ใช้exec(open(fn).read())ยังมีแพ็คเกจ importlib
DevPlayer

106

หากคุณไม่สามารถเปลี่ยนชื่อโมดูลให้ตรงกับหลักการตั้งชื่อของ Python ให้สร้างโมดูลใหม่เพื่อทำหน้าที่เป็นตัวกลาง:

 ---- foo_proxy.py ----
 tmp = __import__('foo-bar')
 globals().update(vars(tmp))

 ---- main.py ----
 from foo_proxy import * 

30
ฉันจะไม่ใช้สิ่งนี้ แต่ฉันไม่สามารถให้ +1 สำหรับความฉลาดของการแฮ็คนี้ได้
inspectorG4dget

11
คุณจริงสามารถทำเช่นนี้ได้โดยไม่ต้องfoo_proxy.pyไฟล์กำหนดผลลัพธ์ของการ__import__(...) sys.modules['foo_proxy']จริงๆแล้วอย่าทำอย่างนั้นมันเป็นความคิดที่แย่มาก
SingleNegationElimination

3
เจ๋งแค่สิ่งที่ฉันกำลังมองหา มี usecase หากใช้ไลบรารีเนทีฟซึ่งจัดส่งมาพร้อมกับการแจกจ่าย
Sven


46

หากคุณไม่สามารถเปลี่ยนชื่อไฟล์ต้นฉบับคุณสามารถใช้ symlink:

ln -s foo-bar.py foo_bar.py

จากนั้นคุณสามารถ:

from foo_bar import *

2

เช่นเดียวกับที่คนอื่นพูดว่าคุณไม่สามารถใช้ "-" ในการตั้งชื่องูเหลือมมีวิธีแก้ปัญหาหลายวิธีหนึ่งวิธีแก้ปัญหาดังกล่าวซึ่งจะมีประโยชน์ถ้าคุณต้องเพิ่มหลายโมดูลจากเส้นทางที่ใช้ sys.path

ตัวอย่างเช่นถ้าโครงสร้างของคุณเป็นเช่นนี้:

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

import barfoo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.