ขอถามเรื่องการรัน external command จาก python หน่อยครับ

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1001 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1001 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

คือว่าผมจะเขียนโปรแกรมให้รันโปรแกรมอันอื่นครับทีนี้ โปรแกรมนั้นต้องการ input เป็นไฟล์ ถ้าผมไม่อยากให้ทำเป็นไฟล์แต่ว่ากรอกลงไปตรงๆจากไพธอนเลยจะได้หรือเปล่าครับ อย่างเช่น ถ้ารัน "abc.exe file.txt" โดยไม่ต้องสร้าง file.txt ขึ้นมาแต่ input ลงไปตรงๆจาก string ใน python จะมีวิธีหรือเปล่าครับ

แล้วอีกอย่างคือ ถ้าผมจะเอา output จากโปรแกรม external นี้ (ซึ่งออกมาทางหน้าจอ) ให้มันมาที่ตัวแปรในไพธอนตรงๆจะได้หรือเปล่าครับ

ทั้งหมดนี้ลองอ่านแล้วเหมือนกับว่าให้ใช้ module subprocess ไม่ก็ popen.. ถ้าได้ไม่ทราบว่ามีตัวอย่างให้ดูง่ายๆหรือเปล่าครับ ผมลองอ่านๆแล้วยังงงๆ - --''

อีกอย่างนึง อันนี้ไม่เกี่ยวครับ คือ file descriptor คืออะไรเหรอครับ... อ่านแล้วไม่เข้าใจ

ขอบคุณมากครับ

sugree's picture

โปรแกรมต้องการไฟล์ ก็ต้องให้ไฟล์ครับ สร้างไฟล์ชั่วคราวใช้แล้วค่อยลบออก ถ้ามันยอมรับอินพุททาง stdin ค่อยว่ากันอีกเรื่อง เวลาเรียกโปรแกรมภายนอกแล้วต้องการเก็บผลลัพธ์ทาง stdout stderr โดยหลักการใช้ popen ครับ มีฟังก์ชั่นหลายตัวให้เลือกแล้วแต่ว่าจะต้องการระดับไหน เดาว่าคงอยากได้แค่ stdout งั้นใช้ popen2 ก็พอ

import popen2
 
stdout, stdin = popen2.popen2("abc.exe file.txt")
output = stdout.readlines()
stdout.close()
stdin.close()

stdout กับ stdin เป็น file object ข้างในมี file descriptor ซึ่งเป็นตัวเลขอ้างอิงถึงการเปิดไฟล์ทุกรูปแบบในระดับระบบปฏิบัติการ

ขอบคุณมากครับเรื่องไฟล์ ผมจะได้ลองใช้ tempfile ดูซะที - --' พอดีเพิ่งลองหัดครับ (ลองหัดแล้วอาจารย์จะให้บินเลย.)

งั้นขอถามต่อหน่อยครับ

file descriptor มันต่างกับ file object ที่ใช้ open ยังไงครับ ตอนใช้ tempfile สร้างมันขึ้นมาเห็นอ่านได้เขียนได้ แต่ว่า open นี่อ่าน-เขียนอย่างเดียว.

veer's picture

ลอง code แบบนี้ดูครับ. /dev/null ใช้ไฟล์อื่นก็ได้ ถ้าไม่ได้ใช้ unix-like.

file_obj = open("/dev/null")
print file_obj.fileno()

เลขที่ 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/

veer's picture
open("foo.txt", "w+")

แบบนี้ก็อ่าน/เขียนได้ แต่ของเก่าหาย. ถ้าจะเขียนต่อจากไฟล์เดิมใช้

open("foo.txt", "a+")

เหมือน 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 ครั้งแรก แบบนี้หมายความว่าไงเหรอครับ...

veer's picture

ไม่มีคำสั่ง ramp ... ตรงไปตรงมา? ramp เอาไว้ทำอะไร มาจากไหน?
---
http://blog.vee-u.com/

อ่า เป็นโปรแกรมที่ลงเพิ่มไปตอนหลังน่ะครับ...ลงใน shell tcsh. ตอนลองเล่นในคอมพ์เพื่อนก็ได้แต่คอมตัวเองดัน error แบบนี้น่ะครับ

EDIT: แก้ไขได้แล้วครับ เรียกโปรแกรม ramp แบบ full path ไปเลยก็เจอ.. ว่าแต่คำว่า /bin/sh นี่แสดงว่า python ทำงานใน sh shell หรือว่าอะไรเหรอครับ..

sugree's picture

python จะเรียก /bin/sh ramp ครับ เพราะมันไม่รู้ว่าอยู่ไหน ก็เลยโยนให้ sh หาให้

veer's picture

ลงใน tcsh หมายถึงอย่างไรครับ? ช่วยขยายความหน่อยได้เปล่า? อาจจะไม่ช่วยแก้ปัญหาอะไร แตผมอยากรู้อะนะ แฮ่ๆ
---
http://blog.vee-u.com/

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น