วิธีเรียกใช้สคริปต์ python จาก IDLE interactive shell


103

ฉันจะเรียกใช้สคริปต์ python จากภายในเชลล์โต้ตอบ IDLE ได้อย่างไร

สิ่งต่อไปนี้ทำให้เกิดข้อผิดพลาด:

>>> python helloworld.py
SyntaxError: invalid syntax

อะไรhelloworld.pyมีลักษณะเหมือน?
TerryA

ใช่หมายความว่ามีบางอย่างผิดปกติกับ youre code post youre code!
Serial

12
ไม่ไม่จำเป็น โอกาสที่ OP จะพิมพ์python helloworld.pyในหน้าต่าง IDLE เชลล์และไม่ได้ผล
Ned Deily

มันจะไม่ทำงานในล่ามมาตรฐาน ปัญหานี้เกิดขึ้นก่อนที่ผู้คนเข้าใจผิดคิดว่าพรอมต์ล่ามเป็นพรอมต์บรรทัดคำสั่ง
Terry Jan Reedy

คุณควรยอมรับคำตอบจาก Ned Deily หากคำตอบนั้นถูกต้อง นอกจากนี้ยังช่วยให้นักพัฒนารายอื่น ๆ สามารถระบุคำตอบที่ถูกต้องได้อย่างรวดเร็ว
Krishna Oza

คำตอบ:


144

Python3 :

exec(open('helloworld.py').read())

หากไฟล์ของคุณไม่ได้อยู่ใน dir เดียวกัน:

exec(open('./app/filename.py').read())

ดูhttps://stackoverflow.com/a/437857/739577สำหรับการส่งผ่านตัวแปร global / local


ในเวอร์ชัน Python ที่เลิกใช้แล้ว

Python2 ฟังก์ชันในตัว: execfile

execfile('helloworld.py')

โดยปกติไม่สามารถเรียกด้วยข้อโต้แย้งได้ แต่นี่เป็นวิธีแก้ปัญหา:

import sys
sys.argv = ['helloworld.py', 'arg']  # argv[0] should still be the script name
execfile('helloworld.py')

เลิกใช้งานตั้งแต่ 2.6: popen

import os
os.popen('python helloworld.py') # Just run the program
os.popen('python helloworld.py').read() # Also gets you the stdout

ด้วยข้อโต้แย้ง:

os.popen('python helloworld.py arg').read()

การใช้งานขั้นสูง: กระบวนการย่อย

import subprocess
subprocess.call(['python', 'helloworld.py']) # Just run the program
subprocess.check_output(['python', 'helloworld.py']) # Also gets you the stdout

ด้วยข้อโต้แย้ง:

subprocess.call(['python', 'helloworld.py', 'arg'])

อ่านเอกสารเพื่อดูรายละเอียด :-)


ทดสอบด้วยพื้นฐานนี้helloworld.py:

import sys
if len(sys.argv) > 1:
    print(sys.argv[1])

2
คุณช่วยเพิ่มตัวอย่างที่มีอาร์กิวเมนต์บรรทัดคำสั่งด้วยได้ไหม
ViFI

1
ใช้ไม่ได้กับ Python3 และ asker ไม่ได้ระบุเวอร์ชัน Python อย่างชัดเจน
Suncatcher

เพิ่มexecสำหรับ Python3
Hugues Fontenelle


24

หน้าต่าง IDLE เชลล์ไม่เหมือนกับเทอร์มินัลเชลล์ (เช่นรันshหรือbash) แต่มันก็เหมือนกับการอยู่ในล่ามโต้ตอบ Python ( python -i) วิธีที่ง่ายที่สุดในการเรียกใช้สคริปต์ใน IDLE คือการใช้Openคำสั่งจากFileเมนู (ซึ่งอาจแตกต่างกันเล็กน้อยขึ้นอยู่กับแพลตฟอร์มที่คุณใช้งาน) เพื่อโหลดไฟล์สคริปต์ของคุณลงในหน้าต่างตัวแก้ไข IDLE จากนั้นใช้คำสั่งRun-> Run Module(ทางลัด F5)


1
แต่คุณไม่สามารถผ่านข้อโต้แย้งได้ :(
Erica Kane

3
น่าเสียดายที่ไม่มันไม่ใช่เรื่องง่ายที่จะเรียกใช้ไฟล์ Python ใน IDLE ในขณะที่ส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่ง มีปัญหาที่เปิดมายาวนานสำหรับ IDLE ในการดำเนินการดังกล่าว ( bugs.python.org/issue5680 ) วิธีแก้ปัญหาอย่างหนึ่งสำหรับการทดสอบคือการเริ่มต้นด้วยตนเองsys.argvที่จุดเริ่มต้นของโปรแกรมตัวอย่างเช่นภายใต้มาตรฐานif __name__ == "__main__"สำเร็จรูป
Ned Deily

คำตอบนี้อธิบายว่าเหตุใดเราจึงไม่สามารถเรียกใช้สคริปต์ python โดยใช้ IDLE shell ขอบคุณ @NedDeily
arsho

1
ตั้งแต่ IDLE 3.7.4 ตอนนี้คุณสามารถรันโมดูลที่มีอาร์กิวเมนต์ได้ ใช้คำสั่งRun-> ใหม่Run with Customized...(ทางลัด Shift + F5) และป๊อปอัปจะเปิดขึ้นเพื่อให้คุณสามารถจัดหาอาร์กิวเมนต์ของคุณได้ น่าเสียดายที่ตอนนี้จำไม่ได้แล้วดังนั้นคุณจะวางมันทุกครั้งที่วิ่ง
Dan Nolan


4

execFile('helloworld.py')ทำงานให้ฉัน สิ่งที่ควรทราบคือการป้อนชื่อไดเร็กทอรีที่สมบูรณ์ของไฟล์. py หากไม่ได้อยู่ในโฟลเดอร์ Python (อย่างน้อยกรณีนี้ใน Windows)

ตัวอย่างเช่น, execFile('C:/helloworld.py')



2

ตัวอย่างเช่น:

import subprocess

subprocess.call("C:\helloworld.py")

subprocess.call(["python", "-h"])

2
subprocess.call(r'c:\path\to\something.py')ไม่ได้ผลสำหรับฉัน OSError: [WinError 193]% 1 ไม่ใช่แอปพลิเคชัน Win32 ที่ถูกต้อง
Terry Jan Reedy

ลองใช้กระบวนการย่อยนำเข้าระบบนำเข้า DIR = os.path.join ('C: \\', 'Users', 'Sergey', 'Desktop', 'a.py') subprocess.call (['python', DIR] )
Sergey Nosov

1

ใน Python 3 ไม่มีexecFile. สามารถใช้execฟังก์ชันในตัวได้เช่น:

import helloworld
exec('helloworld')

1

ใน IDLE การทำงานดังต่อไปนี้: -

import helloworld

ฉันไม่รู้มากว่าทำไมมันถึงได้ผล แต่มัน ..


สิ่งที่คุณกำลังทำคือการโหลดโมดูลที่ไม่ได้ทำงานจากเชลล์ หนึ่งความแตกต่างระหว่างสองคือ 1) กำลังโหลดโมดูลชื่อโมดูลของคุณชื่อ __ = ชื่อไฟล์ 2) เรียกใช้จากชื่อโมดูลเชลล์_name __ = " _main "
tanweer alam

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

1

ในการรันสคริปต์ python ใน python shell เช่น Idle หรือใน Django shell คุณสามารถทำสิ่งต่อไปนี้โดยใช้ฟังก์ชัน exec () Exec () เรียกใช้อาร์กิวเมนต์อ็อบเจ็กต์รหัส ออบเจ็กต์รหัสใน Python เป็นเพียงโค้ด Python ที่รวบรวม ดังนั้นคุณต้องคอมไพล์ไฟล์สคริปต์ของคุณก่อนแล้วจึงเรียกใช้งานโดยใช้ exec () จากเปลือกของคุณ:

>>>file_to_compile = open('/path/to/your/file.py').read()
>>>code_object = compile(file_to_compile, '<string>', 'exec')
>>>exec(code_object)

ฉันใช้ Python 3.4 ดูเอกสารคอมไพล์และExecสำหรับข้อมูลโดยละเอียด


1

ฉันทดสอบสิ่งนี้และได้ผล:

exec(open('filename').read())  # Don't forget to put the filename between ' '

ขอบคุณสำหรับเคล็ดลับใบเสนอราคานี้ใช้ได้ผลสำหรับฉัน โหวตแล้ว
Forever Learner

1

คุณสามารถทำได้สองวิธี

  • import file_name

  • exec(open('file_name').read())

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


0

ในสภาพแวดล้อม Windows คุณสามารถเรียกใช้ไฟล์ py บนบรรทัดคำสั่งเชลล์ Python3 ด้วยไวยากรณ์ต่อไปนี้:

exec (เปิด ('พา ธ สัมบูรณ์ไปยัง file_name') อ่าน ())

ด้านล่างนี้อธิบายวิธีเรียกใช้ไฟล์ helloworld.py อย่างง่ายจากบรรทัดคำสั่ง python shell

ตำแหน่งไฟล์: C: /Users/testuser/testfolder/helloworld.py

เนื้อหาไฟล์: พิมพ์ ("สวัสดีชาวโลก")

เราสามารถเรียกใช้ไฟล์นี้บน Python3.7 Shell ได้ดังนี้:

>>> import os
>>> abs_path = 'C://Users/testuser/testfolder'
>>> os.chdir(abs_path)
>>> os.getcwd()
'C:\\Users\\testuser\\testfolder'

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

>>> exec(open("C:\\Users\\testuser\\testfolder\\helloworld.py").read())
hello world

>>> os.path.abspath("helloworld.py")
'C:\\Users\\testuser\\testfolder\\helloworld.py'
>>> import helloworld
hello world

การนำเข้าโปรแกรมเพื่อเรียกใช้งานไม่ใช่ตัวเลือกที่ดี แม้ว่าฉันจะใช้มันในตอนเริ่มต้น แต่ตอนนี้ฉันรู้แล้วเกี่ยวกับปัญหาที่อาจเกิดขึ้นเช่นมันทำให้โปรแกรมของคุณหมดประสิทธิภาพเนื่องจากคุณกำลังนำเข้า (แม้ว่าจะเล็กน้อย)
Abhijeet.py


0

ในคอนโซล python คุณสามารถลองใช้ 2 วิธีต่อไปนี้

ภายใต้ไดเรกทอรีงานเดียวกัน

1. >> นำเข้า helloworld

# ถ้าคุณมีตัวแปรxคุณสามารถพิมพ์ได้ใน IDLE

>> helloworld.x

# ถ้าคุณมีฟังก์ชันfuncคุณสามารถเรียกมันแบบนี้ได้

>> helloworld.func ()

2. >> runfile ("./ helloworld.py")

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