จะเรียกใช้งานไฟล์ภายในตัวแปล python ได้อย่างไร?


289

ฉันพยายามรันไฟล์ด้วยคำสั่ง python จากภายในล่าม

แก้ไข: ฉันพยายามใช้ตัวแปรและการตั้งค่าจากไฟล์นั้นไม่ต้องเรียกใช้กระบวนการแยกต่างหาก


2
โมดูลระบบปฏิบัติการและฉันกำลังตรวจสอบคำตอบอื่น ๆ
Adam Matan

2
os.system ที่แนะนำ และคำตอบที่ถูกลบเมื่อฉันอ่านแก้ไข: - /
lightsong

คำตอบ:


229

ได้หลายวิธี

จากเปลือก

python someFile.py

จากภายใน IDLE กดF5

หากคุณกำลังพิมพ์แบบโต้ตอบให้ลองสิ่งนี้: ( Python 2 เท่านั้น !)

>>> variables= {}
>>> execfile( "someFile.py", variables )
>>> print variables # globals from the someFile module

สำหรับ Python3ให้ใช้:

>>> exec(open("filename.py").read())

10
pythonไม่ทำงานหากคุณใช้งาน python 3 แต่python3จะใช้งานแทน
pzkpfw

41
Execfile ไม่มีอยู่ใน python3 อีกต่อไปและ exec () ดูเหมือนจะไม่ทำงานอย่างใด ... ไม่แน่ใจว่าสิ่งที่ฉันทำผิด คุณสามารถปรับปรุงคำตอบได้ไหม
temporary_user_name

มีวิธีใดบ้างในการจัดเตรียมstdinจากไฟล์อย่างที่ใช้<กับสคริปต์การเรียกใช้ด้วยในexecfile()? @ s-lott
bhanu

9
@pzkpfw python สามารถชี้ไปที่เวอร์ชันของ python ใดก็ได้ ฉันได้เห็นสภาพแวดล้อมที่มีเพียงหลาม v3 ที่ชี้ไปยังpython python3
StockB

2
@pzkpfw ที่ขึ้นอยู่กับสิ่งที่ปฏิบัติการพบระบบเมื่อมองผ่านโฟลเดอร์ในตัวแปรสภาพแวดล้อมpython PATH
HelloGoodbye

254

สำหรับ Python 2:

>>> execfile('filename.py')

สำหรับ Python 3:

>>> exec(open("filename.py").read())
# or
>>> from pathlib import Path
>>> exec(Path("filename.py").read_text())

ดูเอกสาร หากคุณใช้ Python 3.0 ดูคำถามนี้

ดูคำตอบโดย @ S.Lott สำหรับตัวอย่างของวิธีการเข้าถึง globals จาก filename.py หลังจากเรียกใช้งาน


วิธีการอ่านทำอะไร? น่าเสียดายที่เว็บไซต์เอกสารทางการไม่ได้ให้ตัวอย่างและคำอธิบายที่ชัดเจน
Dmitry

มันอ่านไฟล์และผลตอบแทน (ค่าเริ่มต้น) เนื้อหาทั้งหมดในสายเดียวให้ดูเช่นw3schools หน้าเปิดไฟล์
สูงสุด

นี่คือเอกสารสำหรับ open (): docs.python.org/3/library/io.html
codeape

96

Python 2 + Python 3

exec(open("./path/to/script.py").read(), globals())

สิ่งนี้จะดำเนินการสคริปต์และวางตัวแปรสากลทั้งหมดไว้ในขอบเขตส่วนกลางของล่าม (พฤติกรรมปกติในสภาพแวดล้อมการเขียนสคริปต์ส่วนใหญ่)

execเอกสารPython 3


1
คุณคือฮีโร่ของฉัน! ฉันต่อสู้กับสิ่งแปลก ๆ มาหลายวันแล้วที่ os.getcwd () พูดอย่างหนึ่ง แต่ glob ("*") ทำงานในสารบบอื่น ... ขอบคุณ! ขอบคุณ!
pallevillesen

มีวิธีส่งพารามิเตอร์ไปยังสคริปต์หรือไม่ ต่อไปนี้ไม่ได้ทำงาน: exec (เปิด "setup.py ติดตั้ง") อ่าน () Globals ()).
เบน

1
@ben ที่ใช้งานไม่ได้เพราะopenอ่านรหัสจากสคริปต์โดยตรง หากต้องการส่งผ่านอาร์กิวเมนต์ให้ดูที่คำตอบนี้แต่แทนที่จะexecfileใช้อย่างชัดเจนexecและopenตามที่แสดงไว้ด้านบน
นิโก้

47

แปลกใจที่ฉันยังไม่เห็นสิ่งนี้ คุณสามารถเรียกใช้ไฟล์จากนั้นเปิดล่ามไว้หลังจากที่การดำเนินการสิ้นสุดลงโดยใช้-iตัวเลือก:

| foo.py |
----------
testvar = 10

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18

30

ฉันกำลังพยายามใช้ตัวแปรและการตั้งค่าจากไฟล์นั้นไม่เรียกใช้กระบวนการแยกต่างหาก

เพียงนำเข้าไฟล์ด้วยimport filename(ลบด้วย. จำเป็นต้องอยู่ในไดเรกทอรีเดียวกันหรือบนของคุณPYTHONPATH) จะเรียกใช้ไฟล์ทำให้ตัวแปรฟังก์ชั่นคลาส ฯลฯ มีอยู่ในfilename.variableเนมสเปซ

ดังนั้นหากคุณมีcheddar.pyตัวแปรสแปมและไข่ฟังก์ชัน - คุณสามารถนำเข้าได้ด้วยimport cheddarให้เข้าถึงตัวแปรด้วยcheddar.spamและเรียกใช้ฟังก์ชันโดยการโทรcheddar.eggs()

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


4
สิ่งนั้นจะไม่ใช้เนมสเปซส่วนกลางตามที่คำถามต้องการ ใช้แทนfrom filename import *
Ricardo Cruz

คำถามไม่ได้ระบุเฉพาะการใช้เนมสเปซส่วนกลางซึ่งอาจเป็นสิ่งที่ OP ต้องการ แต่ไม่ชัดเจนจากคำถาม
ryanpcmcquen

13

จากมุมมองของฉันวิธีที่ดีที่สุดคือ:

import yourfile

และหลังจากแก้ไข yourfile.py

reload(yourfile)   

หรือ

import imp; 
imp.reload(yourfile) in python3

แต่สิ่งนี้จะทำให้ฟังก์ชันและคลาสดูเหมือนว่า: yourfile.function1, yourfile.class1 .....

หากคุณไม่สามารถยอมรับสิ่งเหล่านั้นได้ทางออกสุดท้ายคือ:

reload(yourfile)
from yourfile import *

9

ฉันไม่ใช่ผู้เชี่ยวชาญ แต่เป็นสิ่งที่ฉันสังเกตเห็น:

หากรหัสของคุณคือ mycode.py และคุณเพียงพิมพ์ 'import mycode' Python จะเรียกใช้งาน แต่มันจะไม่ทำให้ตัวแปรทั้งหมดของคุณพร้อมใช้งานสำหรับล่าม ฉันพบว่าคุณควรพิมพ์ 'จาก mycode import *' หากคุณต้องการให้ตัวแปรทั้งหมดพร้อมใช้งานสำหรับล่าม


3
นอกจากนี้ควรเป็นความคิดเห็นไม่ใช่คำตอบ
Adam Matan

9

แค่ทำ,

from my_file import *

ตรวจสอบให้แน่ใจว่าไม่ได้เพิ่มนามสกุล. py หากไฟล์. py ของคุณใช้งานไดเรกทอรีย่อย

from my_dir.my_file import *

ดูเหมือนว่าสง่างามที่สุดสำหรับฉัน
Massimiliano Kraus

8

สำหรับการใช้งาน python3 ทั้งที่มีของxxxx = nameyourfile

exec(open('./xxxx.py').read())

8

สำหรับ Python 3:

>>> exec(open("helloworld.py").read())

ตรวจสอบให้แน่ใจว่าคุณอยู่ในไดเรกทอรีที่ถูกต้องก่อนเรียกใช้คำสั่ง

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

with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
    exec(file.read())

1

สมมติว่าคุณต้องการคุณสมบัติต่อไปนี้:

  1. ไฟล์ต้นฉบับทำงานอย่างถูกต้องในดีบักเกอร์ของคุณ (ชื่อไฟล์แสดงในสแต็ก ฯลฯ )
  2. __name__ == '__main__' เป็น True ดังนั้นสคริปต์จะทำงานอย่างถูกต้องเหมือนสคริปต์

exec(open('foo.py').read())ล้มเหลวคุณลักษณะ 1 import fooกลยุทธ์ล้มเหลวคุณลักษณะ 2

ในการรับทั้งสองอย่างคุณจะต้อง:

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