Làm cách nào để nhập mô-đun khi tên mô-đun có dấu gạch ngang '-' hoặc dấu gạch nối trong đó?


193

Tôi muốn nhập foo-bar.py. Những công việc này:

foobar = __import__("foo-bar")

Điều này không:

from "foo-bar" import *

Câu hỏi của tôi: Có cách nào để tôi có thể sử dụng định dạng trên tức là, from "foo-bar" import *để nhập một mô-đun có -trong đó không?


10
Tại sao bạn có một mô-đun với một dấu gạch ngang trong tên của nó?
Matti Virkkunen

22
Tôi đoán ban đầu nó được viết dưới dạng một kịch bản chứ không phải là một mô-đun.
Michael Hoffman


@MattiVirkkunen makepy.py của win32com sẽ tạo mô-đun với dấu gạch ngang trong đó. quá tệ. comtypes đã giải quyết điều này bằng cách chuyển đổi nó thành dấu gạch dưới
swdev

2
@MattiVirkkunen Tôi nghĩ Python không nên giới hạn tên tôi có thể đặt cho các thư mục của mình. Nó không phải là trách nhiệm của nó để làm như vậy.
Zelphir Kaltstahl

Câu trả lời:


115

bạn không thể foo-barkhông phải là một định danh. đổi tên tập tin thànhfoo_bar.py

Chỉnh sửa: Nếu importkhông phải là mục tiêu của bạn (như trong: bạn không quan tâm đến những gì xảy ra sys.modules, bạn không cần phải nhập nó), chỉ cần đưa tất cả các tệp toàn cầu vào phạm vi của riêng bạn, bạn có thể sử dụngexecfile

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

24
Python 3.x Có gì mới trong Python 3.0 Đã xóa execfile (). Thay vì execfile(fn)sử dụng exec(open(fn).read())Ngoài ra còn có gói importlib.
DevPlayer

103

Nếu bạn không thể đổi tên mô-đun để khớp với quy ước đặt tên Python, hãy tạo mô-đun mới để hoạt động như một trung gian:

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

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

28
Tôi sẽ không bao giờ thực hiện điều này. Nhưng tôi không thể cung cấp +1 cho sự tuyệt vời của vụ hack này
thanh traG4dget

11
bạn thực sự có thể làm điều này mà không có sự foo_proxy.pytập tin, chuyển nhượng đầu ra của __import__(...)để sys.modules['foo_proxy']. Thật ra, đừng làm vậy, đó là một ý tưởng tồi tệ.
SingleNegationElimination

3
Tuyệt vời chỉ là những gì tôi đang tìm kiếm. Có một usecase, nếu một người sử dụng các thư viện nguyên gốc được phân phối cùng với một bản phân phối.
Sven


45

Nếu bạn không thể đổi tên tệp gốc, bạn cũng có thể sử dụng liên kết tượng trưng:

ln -s foo-bar.py foo_bar.py

Sau đó, bạn có thể chỉ:

from foo_bar import *

2

Giống như những người khác nói rằng bạn không thể sử dụng "-" trong cách đặt tên python, có nhiều cách giải quyết, một cách giải quyết như vậy sẽ hữu ích nếu bạn phải thêm nhiều mô-đun từ một đường dẫn đang sử dụng sys.path

Ví dụ: nếu cấu trúc của bạn là như thế này:

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

import barfoo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.