จะรวมโค้ด Python ภายนอกเพื่อใช้ในไฟล์อื่นได้อย่างไร?


117

หากคุณมีคอลเล็กชันวิธีการในไฟล์จะมีวิธีรวมไฟล์เหล่านั้นไว้ในไฟล์อื่นได้หรือไม่ แต่เรียกใช้โดยไม่มีคำนำหน้า (เช่นคำนำหน้าไฟล์)

ดังนั้นถ้าฉันมี:

[Math.py]
def Calculate ( num )

จะเรียกแบบนี้ได้อย่างไร:

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )

คำตอบ:


154

คุณจะต้องนำเข้าไฟล์อื่นเป็นโมดูลดังนี้:

import Math

หากคุณไม่ต้องการนำหน้าCalculateฟังก์ชันของคุณด้วยชื่อโมดูลให้ทำสิ่งนี้:

from Math import Calculate

หากคุณต้องการนำเข้าสมาชิกทั้งหมดของโมดูลให้ทำสิ่งนี้:

from Math import *

แก้ไข: นี่คือบทดีๆจากDive Into Pythonที่เจาะลึกหัวข้อนี้อีกเล็กน้อย


9
ที่น่าสังเกตว่าfrom Math import *จะไม่แนะนำให้ใช้
naught101

1
คุณอาจจะสนใจโมดูลและโทรมายากลimp __import__
Vitold S.

มีคนลืมต่ออายุโดเมน: \
Spechal

48

เพียงเขียนคำสั่ง "รวม":

import os

def include(filename):
    if os.path.exists(filename): 
        execfile(filename)


include('myfile.py')

@Deleet:

@bfieck หมายเหตุถูกต้องสำหรับความเข้ากันได้ของ python 2 และ 3 คุณต้องมี:

Python 2 และ 3: ทางเลือก 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 และ 3: ทางเลือกที่ 2

exec(compile(open('myfile.py').read()))

3
มีเหตุผลอะไรที่ต้องทำสิ่งนี้from module import *? นอกจากนี้หากไฟล์ที่คุณกำลังเรียกมีรหัสอยู่ในตัวรหัสนั้นจะถูกเรียกใช้หากคุณทำเช่นนี้
naught101

4
@ naught101: นั่นคือเป้าหมาย: เพื่อเรียกใช้โค้ดซึ่งไม่ได้เกิดขึ้นกับการนำเข้า โดยปกติแล้วมันเป็นเพียงการกำหนดตัวแปร
Louis

2
@Deleet python 3 ไม่มีexecfile
bfieck

7
จริงๆแล้ว python 3 มีลายเซ็นอื่นcompile()มากกว่าที่กล่าวมา ดังนั้น Python 2 และ 3 ที่ถูกต้อง: ทางเลือก 2 จะเป็น:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan

3
ฟังก์ชันตัวช่วย "รวม" จะไม่ทำงานหากคุณต้องการให้มีตัวแปรในไฟล์ที่รวมอยู่ในขอบเขตในตัวเรียกของ "รวม"
paulj

35

หากคุณใช้:

import Math

นั่นจะช่วยให้คุณใช้ฟังก์ชันของ Math ได้ แต่คุณต้องทำ Math.Calculate ดังนั้นนั่นคือสิ่งที่คุณไม่ต้องการอย่างชัดเจน

หากคุณต้องการนำเข้าฟังก์ชันของโมดูลโดยไม่ต้องนำหน้าคุณต้องตั้งชื่อให้ชัดเจนเช่น:

from Math import Calculate, Add, Subtract

ตอนนี้คุณสามารถอ้างอิงคำนวณเพิ่มและลบเพียงแค่ชื่อของพวกเขา หากคุณต้องการนำเข้าฟังก์ชันทั้งหมดจากคณิตศาสตร์ให้ทำ:

from Math import *

อย่างไรก็ตามคุณควรระมัดระวังอย่างยิ่งเมื่อทำเช่นนี้กับโมดูลที่มีเนื้อหาที่คุณไม่แน่ใจ หากคุณนำเข้าโมดูลสองโมดูลที่มีคำจำกัดความสำหรับชื่อฟังก์ชันเดียวกันฟังก์ชันหนึ่งจะเขียนทับอีกโมดูลหนึ่งโดยที่คุณไม่ฉลาด


1

ฉันพบว่าโมดูลตรวจสอบ python มีประโยชน์มาก

ตัวอย่างเช่นด้วย teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

และจากสคริปต์อื่นหรือคอนโซล python

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

และตอนนี้dostuffควรอยู่ในขอบเขตโลคัลและdostuff ()จะส่งคืนคอนโซลหรือสคริปต์_ name _ในขณะที่การดำเนินการ test.dostuff () จะส่งคืนชื่อโมดูล python

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