Làm cách nào để nhập các tệp Python khác?


799

Làm cách nào để nhập các tệp khác trong Python?

  1. Làm thế nào chính xác tôi có thể nhập một tập tin python cụ thể như thế import file.pynào?
  2. Làm cách nào để nhập thư mục thay vì tệp cụ thể?
  3. Tôi muốn tải một tệp Python động khi chạy, dựa trên đầu vào của người dùng.
  4. Tôi muốn biết làm thế nào để tải chỉ một phần cụ thể từ tập tin.

Ví dụ: trong main.pytôi có:

from extra import * 

Mặc dù điều này mang lại cho tôi tất cả các định nghĩa extra.py, nhưng có lẽ tất cả những gì tôi muốn là một định nghĩa duy nhất:

def gap():
    print
    print

Tôi thêm gì vào importtuyên bố để nhận được gaptừ extra.py?


Câu trả lời:


443

importlibđã được thêm vào Python 3 để lập trình nhập một mô-đun. Nó chỉ là một trình bao bọc xung quanh __import__, xem các tài liệu .

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

Lưu ý: .pyphần mở rộng nên được gỡ bỏ khỏi moduleName. Hàm này cũng xác định một packageđối số cho nhập khẩu tương đối.


Cập nhật: Trả lời dưới đây đã lỗi thời . Sử dụng thay thế gần đây ở trên.

  1. Chỉ cần import filekhông có phần mở rộng '.py'.

  2. Bạn có thể đánh dấu một thư mục là một gói, bằng cách thêm một tệp trống có tên __init__.py.

  3. Bạn có thể sử dụng __import__chức năng. Nó lấy tên mô-đun như một chuỗi. (Một lần nữa: tên mô-đun không có phần mở rộng '.py'.)

    pmName = input('Enter module name:')
    pm = __import__(pmName)
    print(dir(pm))

    Nhập help(__import__)để biết thêm chi tiết.


7
Nếu bạn thêm một import filenamevào init .py thì bạn có thể nhập mô-đun trực tiếp làm tên thư mục.
CornSmith

9
từ help(__import__):Because this function is meant for use by the Python interpreter and not for general use it is better to use importlib.import_module() to programmatically import a module.
Tadhg McDonald-Jensen

6
Điều gì xảy ra nếu nó không phải là một gói mà chỉ là một tập tin kịch bản?
Jonathan

3
Để nhập tệp tập lệnh trong cùng một đường dẫn (có thể nó cũng sẽ hoạt động cho tệp tập lệnh trong đường dẫn tìm kiếm Python), import filenamenoexttôi chỉ làm việc tốt với Python 3.4.8.
Hội trường Alex

7
Nó vẫn chính xác vào năm 2019? Nó là python3 hay 2?
Sandburg

1032

Có nhiều cách để nhập tệp python, tất cả đều có ưu và nhược điểm của chúng.

Đừng vội vàng chọn chiến lược nhập đầu tiên phù hợp với bạn nếu không bạn sẽ phải viết lại cơ sở mã sau này khi bạn thấy nó không đáp ứng nhu cầu của bạn.

Tôi sẽ bắt đầu giải thích ví dụ dễ nhất # 1, sau đó tôi sẽ chuyển sang ví dụ mạnh mẽ và chuyên nghiệp nhất # 7

Ví dụ 1, Nhập mô-đun python với trình thông dịch python:

  1. Đặt cái này trong /home/el/foo/fox.py:

    def what_does_the_fox_say():
      print("vixens cry")
  2. Nhận được vào trình thông dịch python:

    el@apollo:/home/el/foo$ python
    Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
    >>> import fox
    >>> fox.what_does_the_fox_say()
    vixens cry
    >>> 

    Bạn đã nhập cáo thông qua trình thông dịch python, gọi hàm python what_does_the_fox_say()từ bên trong fox.py.

Ví dụ 2, Sử dụng execfilehoặc ( exectrong Python 3 ) trong tập lệnh để thực thi tệp python khác tại chỗ:

  1. Đặt cái này trong /home/el/foo2/mylib.py:

    def moobar():
      print("hi")
  2. Đặt cái này trong /home/el/foo2/main.py:

    execfile("/home/el/foo2/mylib.py")
    moobar()
  3. chạy tập tin:

    el@apollo:/home/el/foo$ python main.py
    hi

    Hàm moobar đã được nhập từ mylib.py và được cung cấp trong main.py

Ví dụ 3, Sử dụng từ ... nhập ... chức năng:

  1. Đặt cái này trong /home/el/foo3/chekov.py:

    def question():
      print "where are the nuclear wessels?"
  2. Đặt cái này trong /home/el/foo3/main.py:

    from chekov import question
    question()
  3. Chạy nó như thế này:

    el@apollo:/home/el/foo3$ python main.py 
    where are the nuclear wessels?

    Nếu bạn đã xác định các chức năng khác trong chekov.py, chúng sẽ không khả dụng trừ khi bạn import *

Ví dụ 4, Nhập riaa.py nếu nó ở một vị trí tệp khác với vị trí được nhập

  1. Đặt cái này vào /home/el/foo4/ ware / riaa.py:

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
  2. Đặt cái này trong /home/el/foo4/main.py:

    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()
  3. Chạy nó:

    el@apollo:/home/el/foo4$ python main.py 
    computers are transforming into a noose and a yoke for humans

    Mà nhập mọi thứ trong tệp nước ngoài từ một thư mục khác.

Ví dụ 5, sử dụng os.system("python yourfile.py")

import os
os.system("python yourfile.py")

Ví dụ 6, nhập tệp của bạn thông qua cõng khởi động python:

Cập nhật: Ví dụ này được sử dụng để làm việc cho cả python2 và 3, nhưng bây giờ chỉ hoạt động cho python2. python3 đã loại bỏ bộ tính năng khởi động người dùng này vì nó bị lạm dụng bởi những người viết thư viện python có kỹ năng thấp, sử dụng nó để tiêm mã của họ vào không gian tên toàn cầu, trước tất cả các chương trình do người dùng định nghĩa. Nếu bạn muốn nó hoạt động cho python3, bạn sẽ phải sáng tạo hơn. Nếu tôi cho bạn biết làm thế nào để làm điều đó, các nhà phát triển python cũng sẽ vô hiệu hóa bộ tính năng đó, vì vậy bạn tự mình làm.

Xem: https://docs.python.org/2/l Library / user.html

Đặt mã này vào thư mục nhà của bạn trong ~/.pythonrc.py

class secretclass:
    def secretmessage(cls, myarg):
        return myarg + " is if.. up in the sky, the sky"
    secretmessage = classmethod( secretmessage )

    def skycake(cls):
        return "cookie and sky pie people can't go up and "
    skycake = classmethod( skycake )

Đặt mã này vào main.txt của bạn (có thể ở bất cứ đâu):

import user
msg = "The only way skycake tates good" 
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")

Chạy nó, bạn sẽ nhận được điều này:

$ python main.py
The only way skycake tates good is if.. up in the sky, 
the skycookie and sky pie people can't go up and  have the sky pie! 
SKYCAKE!

Nếu bạn gặp lỗi ở đây: ModuleNotFoundError: No module named 'user'thì có nghĩa là bạn đang sử dụng python3, startuphooks bị tắt ở đó theo mặc định.

Tín dụng cho ý kiến ​​này được gửi tới: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Gửi dọc theo thuyền của bạn.

Ví dụ 7, Mạnh mẽ nhất: Nhập tệp trong python bằng lệnh nhập trần:

  1. Tạo một thư mục mới /home/el/foo5/
  2. Tạo một thư mục mới /home/el/foo5/herp
  3. Tạo một tập tin trống có tên __init__.pytheo herp:

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
  4. Tạo một thư mục mới / home / el / foo5 / herp / derp

  5. Trong derp, tạo một __init__.pytệp khác :

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
  6. Dưới / home / el / foo5 / herp / derp tạo một tệp mới có tên yolo.pyĐặt cái này vào đó:

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
  7. Thời điểm của sự thật, Tạo tập tin mới /home/el/foo5/main.py, đặt cái này vào đó;

    from herp.derp.yolo import skycake
    skycake()
  8. Chạy nó:

    el@apollo:/home/el/foo5$ python main.py
    SkyCake evolves to stay just beyond the cognitive reach of the bulk 
    of men. SKYCAKE!!

    Tệp trống __init__.pyliên lạc với trình thông dịch python mà nhà phát triển dự định thư mục này là một gói có thể nhập được.

Nếu bạn muốn xem bài đăng của tôi về cách bao gồm TẤT CẢ các tệp .py trong thư mục, hãy xem tại đây: https://stackoverflow.com/a/20753073/445131


6
Bạn cũng nên thêm Ví dụ 6: bằng cách sử dụng __import__(py_file_name). Hướng dẫn tuyệt vời nào
oriadam

4
Mỗi khi tôi gặp vấn đề nhập khẩu, tôi kết thúc câu hỏi này và luôn có thể giải quyết vấn đề của mình. Nếu tôi có thể nâng cấp điều này cho mỗi lần bạn giúp tôi, tôi sẽ làm thế.
dgBP

4
Sự khác biệt lớn giữa tất cả những thứ này là gì, và tại sao cái này tốt hơn cái nào khác? Ví dụ 5, bạn viết "Nhập tệp trong python bằng lệnh nhập trần", nhưng bạn cũng sử dụng lệnh nhập (trần?) Trong các ví dụ 1, 3 và 4, phải không?
HelloGoodbye

34
Câu trả lời tốt nhưng thực tế là bạn sử dụng một tệp nhập khác nhau làm ví dụ mọi lúc khiến nó khó đọc.
gạc

2
Tôi muốn nhấn mạnh rằng ngay cả khi bạn làm việc trên Windows, quá trình nhập là phân biệt chữ hoa chữ thường. Vì vậy, bạn không thể có Module.py và có trong mô-đun nhập
radato

66

Để nhập tệp Python cụ thể tại 'runtime' với tên đã biết:

import os
import sys

...

scriptpath = "../Test/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule

Bạn tôi đã kiểm tra điều này ngày hôm nay không có may mắn - có vẻ như tên tệp không nên ở đó. Anh ta đã sử dụng tệp cục bộ trong thư mục mẹ và "./" hoạt động ở cuối như thể thư mục mẹ (..). Khắc phục sự cố trong bài đăng đã bị từ chối - có thể là hiểu nhầm (?) In sys.path và so sánh các bản ghi nếu bạn không chắc chắn ...
Tom

29

Bạn không có nhiều phương pháp phức tạp để nhập tệp python từ thư mục này sang thư mục khác. Chỉ cần tạo tệp __init__.py để khai báo thư mục này là gói python và sau đó đi đến tệp máy chủ của bạn nơi bạn muốn nhập chỉ cần nhập

from root.parent.folder.file import variable, class, whatever


15
Nếu tôi muốn một con đường tương đối thì sao?
domih

21

Nhập tài liệu .. - Liên kết để tham khảo

Các __init__.pytệp được yêu cầu để làm cho Python coi các thư mục là chứa các gói, điều này được thực hiện để ngăn các thư mục có tên chung, chẳng hạn như chuỗi, vô tình ẩn các mô-đun hợp lệ xảy ra sau này trên đường tìm kiếm mô-đun.

__init__.pycó thể chỉ là một tệp trống, nhưng nó cũng có thể thực thi mã khởi tạo cho gói hoặc đặt __all__biến.

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module

19

Trường hợp đầu tiên: Bạn muốn nhập tệp A.pytrong tệp B.py, hai tệp này nằm trong cùng một thư mục, như sau:

. 
├── A.py 
└── B.py

Bạn có thể làm điều này trong tập tin B.py:

import A

hoặc là

from A import *

hoặc là

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Sau đó, bạn sẽ có thể sử dụng tất cả các chức năng của tệp A.pytrong tệpB.py


Trường hợp thứ hai: Bạn muốn nhập tệp folder/A.pytrong tệp B.py, hai tệp này không nằm trong cùng một thư mục, như sau:

.
├── B.py
└── folder
     └── A.py

Bạn có thể làm điều này trong tệp B:

import folder.A

hoặc là

from folder.A import *

hoặc là

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Sau đó, bạn sẽ có thể sử dụng tất cả các chức năng của tệp A.pytrong tệpB.py


Tóm tắt: Trong trường hợp đầu tiên, tệp A.pylà một mô-đun mà bạn nhập trong tệp B.py, bạn đã sử dụng cú pháp import module_name. Trong trường hợp thứ hai, folderlà gói chứa mô-đun A.py, bạn đã sử dụng cú pháp import package_name.module_name.

Để biết thêm thông tin về các gói và mô-đun, tham khảo liên kết này .


Tôi đã thử với một chút biến thể và nó đã hoạt động. from folder_a.script import *Script.py nằm trong thư mục a.
Justin

+1 Đây là những gì tôi đang tìm kiếm. Không thể hiểu các câu trả lời khác nhưng bạn đã giải thích nó bằng các thư mục.
Sấm đen

Nếu tôi muốn nhập tệp py trong thư mục mẹ thì sao?
bytedev

1
@bytedev Thêm import syssys.path.append("..")vào đầu tập tin. Theo đó: stackoverflow.com/a/48341902/6057480 . Đã kiểm tra, hoạt động hoàn hảo, sau khi thực hiện việc này, bạn sẽ có thể nhập tệp py trong thư mục mẹ và vẫn có thể nhập tệp py trong cùng thư mục và thư mục con.
Bohao LI

17
from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function

Bây giờ đây là hai cách đơn giản mà tôi đã hiểu và đảm bảo rằng tệp "file.py" mà bạn muốn nhập dưới dạng thư viện chỉ có trong thư mục hiện tại của bạn.


9

Nếu chức năng được xác định là trong một tệp x.py:

def greet():
    print('Hello! How are you?')

Trong tệp mà bạn đang nhập hàm, hãy viết này:

from x import greet

Điều này rất hữu ích nếu bạn không muốn nhập tất cả các chức năng trong một tệp.


7

cách tốt nhất để nhập tệp .py là bằng cách __init__.py. điều đơn giản nhất để làm là tạo một tệp trống có tên __init__.pytrong cùng thư mục chứa tệp của bạn.

bài đăng này của Mike Grouchy là một lời giải thích tuyệt vời __init__.pyvà sử dụng để tạo, nhập và thiết lập các gói python.


1
@GhostCat Tôi đã cập nhật phản hồi của mình. cảm ơn vì liên kết "nó sẽ thích hợp hơn".
tối cao

Và hiểu rằng không phải ai cũng sống trong múi giờ của bạn.
GhostCat

4
Bạn nên đăng nội dung bài đăng của Mike Grouchy, đặc biệt là khi liên kết hiện 404s. web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/...
qwr

6

Cách tôi nhập là nhập tệp và sử dụng tốc ký của tên đó.

import DoStuff.py as DS
DS.main()

Đừng quên rằng tệp nhập của bạn PHẢI được đặt tên bằng phần mở rộng .py


3
Sẽ không import DoStuff.py as DScố gắng nhập pytừ DoStuffđâu?
Benj

5

Tôi muốn thêm ghi chú này Tôi không rõ ràng ở nơi khác; bên trong một mô-đun / gói, khi tải từ tệp, tên mô-đun / gói phải được thêm tiền tố vào mymodule. Hãy tưởng tượng mymoduleđược bố trí như thế này:

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py

Khi tải somefile.py/ otherstuff.pytừ __init__.pynội dung sẽ như sau:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc

2

Trong trường hợp mô-đun bạn muốn nhập không nằm trong thư mục con , hãy thử cách sau và chạyapp.py từ thư mục mẹ chung sâu nhất:

Cấu trúc thư mục:

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

Trong app.py, nối đường dẫn của máy khách vào sys.path:

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

Tùy chọn (Nếu bạn tải ví dụ: cấu hình) (Kiểm tra dường như là mạnh mẽ nhất cho các trường hợp sử dụng của tôi)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

Chạy

user@host:/path/to/common_dir$ python3 application/app.py

Giải pháp này hiệu quả với tôi trong cli, cũng như PyCharm.


2

Có một số cách bao gồm tập lệnh python của bạn với tên abc.py

  1. ví dụ: nếu tệp của bạn được gọi là abc.py (nhập abc) Hạn chế là tệp của bạn phải có mặt ở cùng vị trí nơi tập lệnh python gọi của bạn.

nhập khẩu abc

  1. ví dụ: nếu tệp python của bạn nằm trong thư mục Windows. Thư mục Windows có mặt tại cùng địa điểm nơi tập lệnh python gọi của bạn.

từ thư mục nhập abc

  1. Tập lệnh abc.py có sẵn trong nội bộ có sẵn Internal_folder có trong thư mục

từ thư mục.iternal_folder nhập abc

  1. Như James đã trả lời ở trên, trong trường hợp tệp của bạn ở một vị trí cố định

nhập os
nhập sys
scriptpath = "../Test/MyModule.py"
sys.path.append (os.path.abspath (scriptpath))
nhập MyModule

Trong trường hợp tập lệnh python của bạn được cập nhật và bạn không muốn tải lên - hãy sử dụng các câu lệnh này để tự động làm mới. Tặng kem :)

%load_ext autoreload 
%autoreload 2

1

Chỉ cần nhập tệp python trong tệp python khác

giả sử tôi có tệp python helper.py có chức năng hiển thị như,

def display():
    print("I'm working sundar gsv")

Bây giờ trong app.py , bạn có thể sử dụng chức năng hiển thị,

import helper
helper.display()

Đầu ra,

I'm working sundar gsv

LƯU Ý: Không cần chỉ định phần mở rộng .py.


1

Điều này nghe có vẻ điên rồ nhưng bạn chỉ có thể tạo một liên kết tượng trưng đến tệp bạn muốn nhập nếu bạn chỉ đang tạo một tập lệnh bao bọc cho nó.


1

Bạn cũng có thể làm điều này: from filename import something

ví dụ: from client import Client Lưu ý rằng bạn không cần .py .pyw .pyuiphần mở rộng.


1

Đây là cách tôi đã làm để gọi một hàm từ tệp python, nó linh hoạt để tôi gọi bất kỳ hàm nào.

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)

Làm thế nào là làm cho một chức năng mới tốt hơn so với việc sử dụng chức năng trực tiếp?
qwr

@qwr Hàm mới callfunc () chỉ đơn giản là một trình bao bọc của mã để gọi hàm đích trong tệp python một cách linh hoạt. Ví dụ được đưa ra là mục tiêu "myfunc" trong tệp python "pathto / myfile.py". Bạn có ý nghĩa gì khi "sử dụng chức năng trực tiếp"?
Xiao-Feng Li

Làm việc hoàn hảo cho tôi. Trong ví dụ của tôi, tôi thay thế: from mypath import Pathvới Path = callfunc("/folder/to/mypath.py", "Path"). Cảm ơn @ Xiao-FengLi
dùng319436

@ user319436 Rất vui vì câu trả lời của tôi cuối cùng cũng giúp được ai đó. :)
Xiao-Feng Li

Cảm ơn @ xiao-feng-li !! Câu trả lời chính xác!!
Altieres de Matos

0

Có nhiều cách, như được liệt kê ở trên, nhưng tôi thấy rằng tôi chỉ muốn nhập nội dung của tệp và không muốn phải viết các dòng và dòng và phải nhập các mô-đun khác . Vì vậy, tôi đã nghĩ ra một cách để lấy nội dung của một tệp, ngay cả với cú pháp dấu chấm ( file.property) trái ngược với việc hợp nhất tệp đã nhập với tệp của bạn.
Trước hết, đây là tập tin của tôi mà tôi sẽ nhập,data.py

    testString= "A string literal to import and test with"


Lưu ý: Bạn có thể sử dụng .txtphần mở rộng thay thế.
Trong mainfile.py, bắt đầu bằng cách mở và nhận nội dung.

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

Bây giờ bạn có nội dung dưới dạng một chuỗi, nhưng cố gắng truy cập data.testStringsẽ gây ra lỗi, như datalà một thể hiện của strlớp và ngay cả khi nó có thuộc tính, testStringnó sẽ không làm như bạn mong đợi.
Tiếp theo, tạo một lớp. Chẳng hạn (ý định chơi chữ),ImportedFile

    class ImportedFile:

Và đặt nó vào trong đó (với thụt đầu dòng thích hợp):

    exec(data)


Và cuối cùng, gán lại datanhư vậy:

    data=ImportedFile()

Và đó là nó! Chỉ cần truy cập như bạn muốn cho bất kỳ mô-đun nào khác, gõ print(data.testString)sẽ in ra bàn điều khiển A string literal to import and test with.
Tuy nhiên, nếu bạn muốn tương đương với việc from mod import *bỏ lớp, bài tập thể hiện và hủy bỏ exec.

Hy vọng điều này sẽ giúp :)
-Benji


Bạn nghiêm túc nghĩ rằng đọc nội dung của tệp dưới dạng một chuỗi và sau đó thực thi nó là một giải pháp tốt khi chúng tôi có tất cả các giải pháp khác mà mọi người đã đăng?
qwr

@qwr Erm vâng, tôi làm. Nhiều câu trả lời khác không hoạt động trong một số tình huống. Đó là lý do tại sao tôi cần một cách dễ dàng được đảm bảo để làm việc. Nếu bạn không có khả năng nhìn thấy mọi thứ từ quan điểm của bà mẹ, bạn cần thử sử dụng IDLE chính thức.
Ngày

0

Một tính năng rất lạ của Python là khả năng nhập ziptệp:

library.zip
|-library
|--__init__.py

Các tập tin __init__.pycủa gói chứa sau đây:

def dummy():
    print 'Testing things out...'

Chúng tôi có thể viết một tập lệnh khác có thể nhập một gói từ kho lưu trữ zip. Chỉ cần thêm tệp zip vào sys.path.

import sys
sys.path.append(r'library.zip')

import library

def run():
    library.dummy()

run()

tập tin zip cung cấp lợi ích gì?
qwr
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.