ให้python รับค่าเป็นอาร์กิวเมนท์อย่างไร

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 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 1005 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.

ผมจะเขียนโปรแกรมตัวหนึ่งให้ php เรียก แล้วไปทำอะไร
บ้างอย่าง แล้วส่งค่ากลับเข้ามาให้ php นะครับ
ผมไม่รู้ว่าจะเขียนอย่างไรนะครับ
เช่น

programepython.exe ar1,ar2

แล้วเราจะได้ค่ากลับมาจาก programepython.exe
ใช้อะไรหรือครับ

เขาใช้ input() หรือ raw_input() หรือเปล่าครับ
แต่ทั้ง 2 ตัวมันต้องใช้ในตัวโปรแกรมไม่ใช่หรือครับ

ใช้ sys.argv ครับ argument ตัวที่ 0,1,2,… จะอยู่ในตัวแปรนี้ในรูปแบบของ list

ตัวอย่างง่ายๆ

import sys
ar0 = sys.argv[0]
ar1 = sys.argv[1]
ar2 = sys.argv[2]

จริงๆ แล้วเวลาใช้อ้างอิง sys.argv[0] ไปตรงๆ เลยก็ได้ แต่ตัวอย่างนี้เขียนให้เห็นชัดๆ

ตอบนาทีเดียวกันเลยครับ :D

ใจตรงกัน :-P

sugree's picture

ช่วงนี้ต้องบอกว่า

จังหวะหัวใจตรงกัน

ใช้ sys.argv ครับ

#!/usr/bin/python
 
#test.py
 
import sys
print 'Hello arguments : ', sys.argv

$ python test.py arg1 arg2 arg3
Hello arguments : ['test.py', 'arg1', 'arg2', 'arg3']

แบบนี้อาจจะดูดีมีชาติตระกูลขึ้น

def your_function(a,b):
    print a,b

if __name__=='__main__':
    import optparse
    parser = optparse.OptionParser()

    parser.add_option(
        '-a','--option-a',
        dest='a_arg',default='asdf',
        help='The A Option as Text, default is \'asdf\'.')
    parser.add_option(
        '-b','--option-b',
        type='int',dest='b_arg',default=8000,
        help='The B Option as Int, default is 8000.')
    options, args = parser.parse_args()

    your_function(options.a_arg,options.b_arg)
khao_lek's picture

ขอขอบคุณทุกๆ ท่านเลยครับ
พอดีใน php5 มันใช้งาน mimetype ไม่ได้ ผมเลย
จะใช้python ตรวจสอบ mimetype ให้นะครับ

khao_lek's picture

เขียนโปรแกรมได้แล้วครับ แต่มันมีปัญหาว่า
ตอนทดสอบผลออกมาตรงหมด แต่พอรันเป็น exe
ดันออกมาค่าเดี่ยวกันหมดเลยครับคือ "application/octet-stream"
เลยไม่เข้าใจว่ามันเป็นเพราะอะไรนะครับ

# -*- coding: UTF-8 -*-
import mimetypes
import sys
filepath = sys.argv[0]
mimetype = ''
if len(filepath) > 0:
    mimetypes.init()
    filetype = []
    filetype = mimetypes.guess_type(filepath)
    mimetype = filetype[0]
 
print mimetype
khao_lek's picture

อ้อได้แล้วครับ
แก้ไข sys.argv[0] เป็น sys.argv[1]
พอดีรีบไปหน่อยครับ ไม่ได้ตรวจสอบอะไรเลยเรา

ลอง print filepath ออกมาดูหน่อยครับ พอทำเป็น .exe แล้ว argument อาจจะเลื่อน ไปเป็นตัวที่ [1]
แนะนำให้ใช้แบบย้อนกลับ เช่น sys.argv[-1] ซึ่งจะเอาตัวสุดท้ายมาแทน

khao_lek's picture

แต่ตอนนี้เป็นปัญหาที่ว่า โปรแกรมที่เขียนด้วยpython
อ่านไฟล์ได้ไม่ถูกต้องครับ เหมือนกับว่ามันตรวจสอบจาก
นามสกุลของไฟล์นะครับ ไม่ได้ตรวจสอบจากตัวไฟล์จริงๆ
เช่น
c:/folder/mimeck.exe c:/temp/php11.tmp

ไฟล์ php11.tmp คือไฟล์ชั่วคราวที่php copy มานะครับ
แล้วนามสกุลไฟล์ .tmp ไม่มีมันก็เลยให้ค่าเป็น null
ออกมานะครับ เลยอยากสอบถามว่า พอจะมีวิธีที่ตรวจสอบmimetype
ที่ไม่ใช่ตรวจสอบจากนามสกุลไฟล์ไหมครับของ python ไหมครับ

Python มีโมดูล magic อยู่ครับ แต่เท่าที่ลอง ๆ ค้นดู มันมีให้ใช้เฉพาะบน Linux, UNIX* เท่านั้นครับ

import magic
 
ms = magic.open(magic.MAGIC_NONE)
ms.load()
type =  ms.file("/path/to/some/file")
print type
 
f = file("/path/to/some/file", "r")
buffer = f.read(4096)
f.close()
 
type = ms.buffer(buffer)
print type
 
ms.close()
khao_lek's picture

ขอบคุณครับ

ย้าย Codenone

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

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