Trong python, cách nhập tên tệp bắt đầu bằng một số


82

Về cơ bản có một tệp được gọi 8puzzle.pyvà tôi muốn nhập tệp đó vào tệp khác (trong cùng một thư mục và tôi không thể thay đổi tên tệp như tệp được cung cấp). Có cách nào để làm điều này bằng Python không? Tôi đã thử theo cách thông thường from 8puzzle import *, nó cho tôi một lỗi.

Lỗi là:

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>> 

11
Tại sao mọi người nói "nó cho tôi [một] lỗi" và sau đó không đăng lỗi đó là gì?
John Zwinck

7
@JohnZwinck Đó là lỗi cú pháp. Tôi đoán vì "8puzzle" không phải là một số nhận dạng hợp lệ (nó bắt đầu bằng một số) và cú pháp cho câu lệnh nhập yêu cầu một số nhận dạng Python ở đó. Điều này sẽ khiến câu trả lời là "Không, bạn không thể. Đổi tên mô-đun thành thứ gì đó bắt đầu bằng chữ cái hoặc dấu gạch dưới."
millimoose

John đã đưa ra điểm tốt, tôi sẽ ghi nhớ. Và cảm ơn Abhijeet đã thêm thông báo lỗi cho tôi. Cảm ơn.
Simon Guo

1
Đổi tên 8puzzle.pythành puzzle8.pyvà sử dụng import puzzle8.
Bakuriu

Câu trả lời:


94

Bạn có thể làm

puzzle = __import__('8puzzle')

Vấn đề rất thú vị. Tôi sẽ nhớ không đặt tên cho bất cứ thứ gì bằng một con số.

Nếu bạn muốn import *- bạn nên xem câu hỏi và câu trả lời này .


1
hoạt động tuyệt vời! cảm ơn. vâng, tôi sẽ không đặt tên nó bắt đầu bằng một con số, nhưng nó là một tệp phân phát bài tập khóa học, vì vậy tôi không thể thay đổi tên. Nhưng nó có vẻ không thành vấn đề vì chúng tôi đã có giải pháp cho nó. Cảm ơn một lần nữa.
Simon Guo

4
Giúp cứu thế giới, hoặc ít nhất là bạn học của bạn. Nếu bạn nhận được một bài nhập bất khả thi, hãy đưa nó đến sự chú ý của người hướng dẫn. Vâng, đôi khi họ ghét bị sai, nhưng nếu bạn đang gặp vấn đề này, thì những người khác cũng vậy và mặc dù câu trả lời này hoạt động, nó không phải là giải pháp đúng (trừ khi lớp là "Obfuscated Python 101").
msw

1
Một cách tốt hơn (với python 2.7 ít nhất) là sử dụng 'importlib' mô-đun: câu đố = importlib.import_module ( '8puzzle')
Cédric

3
Thực sự có một trường hợp sử dụng tốt cho việc này - như một phần của quá trình biên dịch / sản xuất, việc nối các mô-đun python với nhau là dễ dàng nhất nếu chúng được đặt tên ở dạng từ vựng (nói chung là không quan trọng, nhưng hằng số và nhập ở trên cùng, 'nếu tên 'ở dưới cùng, vì vậy một vài mô-đun bắt đầu bằng' 0 'có thể hữu ích.) Cũng hữu ích trong việc gỡ lỗi bố cục thư mục bất thường như vậy, khi kết hợp với inotify hoặc watch, một cái gì đó như: watch -n .1' cat * | python ', sẽ tải ứng dụng python của bạn mỗi phần mười giây (hoặc ít nhất là nhanh nhất có thể) hoặc: cat $ (find. -name "* .py") | python
fatal_error

1
Đến muộn, nhưng một trường hợp sử dụng khác đang nhập từ các cuộc di cư Alembic, vì tất cả chúng đều bắt đầu bằng các hàm băm ngẫu nhiên
kevlarr

35

Các câu trả lời trên đều đúng, nhưng hiện tại, cách được khuyến nghị là sử dụng import_modulehàm:

importlib.import_module(name, package=None)
Nhập một mô-đun. Đối số tên chỉ định mô-đun nào cần nhập theo các điều khoản tuyệt đối hoặc tương đối (ví dụ: hoặc pkg.modhoặc ..mod). Nếu tên được chỉ định trong điều kiện tương đối, thì đối số gói phải được đặt thành tên của gói sẽ hoạt động như một mỏ neo để phân giải tên gói (ví dụ: import_module('..mod', 'pkg.subpkg')sẽ nhập pkg.mod).

Hàm import_module () hoạt động như một trình bao bọc đơn giản hóa xung quanh importlib.__import__(). Điều này có nghĩa là tất cả các ngữ nghĩa của hàm được bắt nguồn từ importlib.__import__(). Sự khác biệt quan trọng nhất giữa hai hàm này là import_module()trả về gói hoặc mô-đun được chỉ định (ví dụ pkg.mod), trong khi __import__()trả về gói hoặc mô-đun cấp cao nhất (ví dụ pkg).

Nếu bạn đang nhập động một mô-đun đã được tạo kể từ khi trình thông dịch bắt đầu thực thi (ví dụ: đã tạo tệp nguồn Python), bạn có thể cần gọi invalidate_caches()để hệ thống nhập nhận thấy mô-đun mới.

__import__ không được khuyến khích bây giờ.

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
Một triển khai của __import__()chức năng tích hợp sẵn.

Lưu ý Nhập theo chương trình của các mô-đun nên sử dụng import_module()thay vì chức năng này.


Nó hoạt động, cảm ơn, nhưng nó không hoạt động để nhập một hàm hoặc biến bên trong một trong những tệp này bắt đầu bằng một số. Nếu tôi làm an_imported_file = importlib.import_module('13_file'):, thì tôi không thể làm from an_imported_file import var_x. Có điều gì có thể làm để đạt được điều này không?
Martin

/usr/local/bin/python3.7 "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py" Traceback (most recent call last): File "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py", line 7, in <module> from an_imported_file import var_x ModuleNotFoundError: No module named 'an_imported_file'
Martin

Ngoài ra, dòng `từ an_imported_file import var_x` trong Pycharm được gạch dưới màu đỏ ...
Martin

Tôi không biết xin lỗi. Lời khuyên chung của tôi là tránh làm điều này.
laike9m

0

Không sử dụng .pytiện ích mở rộng trong quá trình nhập của bạn.

Không from 8puzzle import *hoạt động?

Đối với những gì nó đáng giá, from x import *không phải là một mẫu Python ưa thích, vì nó làm tràn không gian tên của mô-đun đó vào ngữ cảnh hiện tại của bạn.

Nói chung, hãy cố gắng nhập những thứ bạn muốn cụ thể từ mô-đun đó. Bất kỳ toàn cục nào từ mô-đun khác đều có thể được nhập.

ví dụ: nếu bạn có, 8puzzle.foobạn có thể làm `từ nhập 8puzzle

Biên tập:

Mặc dù .pythông điệp của tôi là đúng, nhưng nó không đủ.

__import__('8puzzle')Đề xuất của người đăng khác là đúng. Tuy nhiên, tôi thực sự khuyên bạn nên tránh mô hình này .

Đối với một, nó dành riêng một phương thức Python nội bộ, riêng tư. Về cơ bản, bạn đang phá vỡ các giả định cơ bản về ý nghĩa của việc có thể nhập một mô-đun. Chỉ cần đổi tên tệp thành một thứ khác, chẳng hạn như puzzle8, sẽ khắc phục được điều này.

Điều này sẽ làm thất vọng những lập trình viên Python có kinh nghiệm, những người đang mong đợi biết những gì bạn nhập ở trên cùng và đang mong đợi mã (cố gắng) tuân thủ PEP8 .


1
xin lỗi về sự khó hiểu. Những gì tôi đã làm là from 8puzzle import *và tôi đã chỉnh sửa câu hỏi ban đầu của mình. Và nó không hoạt động như mvanveen đã nói.
Simon Guo

Đó là cái xấu của tôi. Tôi quên rằng tên tệp mô-đun không thể bắt đầu với số. Tôi đã đăng một bản chỉnh sửa.
mvanveen
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.