คือว่าผมจะเขียนโปรแกรมให้รันโปรแกรมอันอื่นครับทีนี้ โปรแกรมนั้นต้องการ input เป็นไฟล์ ถ้าผมไม่อยากให้ทำเป็นไฟล์แต่ว่ากรอกลงไปตรงๆจากไพธอนเลยจะได้หรือเปล่าครับ อย่างเช่น ถ้ารัน "abc.exe file.txt" โดยไม่ต้องสร้าง file.txt ขึ้นมาแต่ input ลงไปตรงๆจาก string ใน python จะมีวิธีหรือเปล่าครับ
แล้วอีกอย่างคือ ถ้าผมจะเอา output จากโปรแกรม external นี้ (ซึ่งออกมาทางหน้าจอ) ให้มันมาที่ตัวแปรในไพธอนตรงๆจะได้หรือเปล่าครับ
ทั้งหมดนี้ลองอ่านแล้วเหมือนกับว่าให้ใช้ module subprocess ไม่ก็ popen.. ถ้าได้ไม่ทราบว่ามีตัวอย่างให้ดูง่ายๆหรือเปล่าครับ ผมลองอ่านๆแล้วยังงงๆ - --''
อีกอย่างนึง อันนี้ไม่เกี่ยวครับ คือ file descriptor คืออะไรเหรอครับ... อ่านแล้วไม่เข้าใจ
ขอบคุณมากครับ
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
โปรแกรมต้องการไฟล์ ก็ต้องให้ไฟล์ครับ สร้างไฟล์ชั่วคราวใช้แล้วค่อยลบออก ถ้ามันยอมรับอินพุททาง stdin ค่อยว่ากันอีกเรื่อง เวลาเรียกโปรแกรมภายนอกแล้วต้องการเก็บผลลัพธ์ทาง stdout stderr โดยหลักการใช้ popen ครับ มีฟังก์ชั่นหลายตัวให้เลือกแล้วแต่ว่าจะต้องการระดับไหน เดาว่าคงอยากได้แค่ stdout งั้นใช้ popen2 ก็พอ
stdout กับ stdin เป็น file object ข้างในมี file descriptor ซึ่งเป็นตัวเลขอ้างอิงถึงการเปิดไฟล์ทุกรูปแบบในระดับระบบปฏิบัติการ
ขอบคุณมากครับเรื่องไฟล์ ผมจะได้ลองใช้ tempfile ดูซะที - --' พอดีเพิ่งลองหัดครับ (ลองหัดแล้วอาจารย์จะให้บินเลย.)
งั้นขอถามต่อหน่อยครับ
file descriptor มันต่างกับ file object ที่ใช้ open ยังไงครับ ตอนใช้ tempfile สร้างมันขึ้นมาเห็นอ่านได้เขียนได้ แต่ว่า open นี่อ่าน-เขียนอย่างเดียว.
ลอง code แบบนี้ดูครับ. /dev/null ใช้ไฟล์อื่นก็ได้ ถ้าไม่ได้ใช้ unix-like.
เลขที่ print ออกมาคือ file descriptor. file object ก็เป็น component ที่ซับซ้อนขึ้นมาหน่อย ข้างในเก็บ file descriptor (fd; ต่อไปขอย่อว่า fd นะ) ไว้อีกที.
จริงๆแล้ว file object ของ python ก็ไม่ได้ไปเก็บ fd ไว้ตรงๆ. แต่เก็บ FILE (ของ libc) ไว้. และใน FILE ก็มี fd อีกที.
มันเป็น layer ประมาณนี้ (Python)File object -> FILE (libc) -> File descriptor (unix)
ถ้าเราสั่ง open("foo.txt") ใน Python. ข้างในมันก็จะไปเรียก fopen("foo.txt", "r") ในภาษาซีให้อีก. แล้วใน fopen ก็ไปเรียก open("foo.txt", flags, mode); ของ unix อีกที (มั้ง ไม่ได้ check code ดู แค่เดาๆ เอา). แล้ว open ของ unix นี่หละ return fd ออกมา. พอ fopen ได้ fd มาก็จะเอาไปเก็บไว้ แล้ว return file pointer (FILE *) ออกมา ซึ่งข้างในเก็บ fd ไว้. open ของ Python ก็ return file object ที่เก็บ file pointer (FILE *) ไว้อีกที.
---
http://blog.vee-u.com/
แบบนี้ก็อ่าน/เขียนได้ แต่ของเก่าหาย. ถ้าจะเขียนต่อจากไฟล์เดิมใช้
เหมือน fopen อะ http://netbsd.gw.com/cgi-bin/man-cgi?fopen++NetBSD-current
ถ้าดูตาม Python 2.5.1 จริงๆ แล้ว open ของ Python มันก็ pass พวก mode เข้าไปใน fopen ดื้อๆเลย. เพียงแต่บน Windows มันแปลง Ascii ให้เป็น Unicode ก่อน. (สงสัยเป็น UTF-32?)
---
http://blog.vee-u.com/
ขอบคุณมากครับ เกตขึ้นเยอะเลย
ขอถามอะไรต่ออีกนิดครับ
พอดีเริ่มลองเขียนใน linux มันหาคำสั่งไม่เจอมันบอกว่า
/bin/sh: ramp: not found (โปรแกรมชื่อ ramp ครับ ลงใน /bin/tcsh )
ผมเพิ่งเคยใช้ linux ครั้งแรก แบบนี้หมายความว่าไงเหรอครับ...
ไม่มีคำสั่ง ramp ... ตรงไปตรงมา? ramp เอาไว้ทำอะไร มาจากไหน?
---
http://blog.vee-u.com/
อ่า เป็นโปรแกรมที่ลงเพิ่มไปตอนหลังน่ะครับ...ลงใน shell tcsh. ตอนลองเล่นในคอมพ์เพื่อนก็ได้แต่คอมตัวเองดัน error แบบนี้น่ะครับ
EDIT: แก้ไขได้แล้วครับ เรียกโปรแกรม ramp แบบ full path ไปเลยก็เจอ.. ว่าแต่คำว่า /bin/sh นี่แสดงว่า python ทำงานใน sh shell หรือว่าอะไรเหรอครับ..
python จะเรียก
/bin/sh rampครับ เพราะมันไม่รู้ว่าอยู่ไหน ก็เลยโยนให้ sh หาให้ลงใน tcsh หมายถึงอย่างไรครับ? ช่วยขยายความหน่อยได้เปล่า? อาจจะไม่ช่วยแก้ปัญหาอะไร แตผมอยากรู้อะนะ แฮ่ๆ
---
http://blog.vee-u.com/