2011-10-07 31 views
10

Tôi có tệp python được gọi là convertImage.py và bên trong tệp. Tôi có một tập lệnh chuyển đổi hình ảnh theo ý thích của tôi, toàn bộ tập lệnh chuyển đổi được đặt bên trong một hàm gọi là convertFile (fileName)thực thi kịch bản python với chức năng từ dòng lệnh, Linux

Bây giờ vấn đề của tôi là tôi cần thực thi kịch bản lệnh python này từ dòng lệnh linux trong khi chuyển hàm convertFile (fileName) cùng với nó.

dụ:

linux user$: python convertImage.py convertFile(fileName) 

này nên thực thi kịch bản python đi qua các chức năng phù hợp.

dụ:

def convertFile(fileName): 

    import os, sys 
    import Image 
    import string 

    splitName = string.split(fileName, "_") 
    endName = splitName[2] 
    splitTwo = string.split(endName, ".") 
    userFolder = splitTwo[0] 

    imageFile = "/var/www/uploads/tmp/"+fileName 

    ...rest of the script... 

    return 

đúng cách để thực thi kịch bản python này và đúng cách vượt qua các tên tập tin để các chức năng từ dòng lệnh liunx là gì?

Thank ở cao cấp

+2

không có điều gì như vậy. Phân tích cú pháp danh sách 'sys.argv' và chọn hành động đúng. Kiểm tra 'argparse' mô-đun – JBernardo

+0

Như đã đề cập bởi S.Lott, '<đối số lệnh>' là một kiểu rất phổ biến. Tốt nhất là người dùng phải có tên lệnh, không phải là kiến ​​thức về triển khai nội bộ. Và bằng cách sử dụng dấu ngoặc đơn (yêu cầu thoát trong bash) như một phần bắt buộc của cú pháp của bạn chỉ là có ý nghĩa. – Cascabel

+0

Các dấu ngoặc đơn chỉ là những lý do ví dụ nhưng tôi đánh giá cao tất cả sự trợ giúp và làm cho nó hoạt động bằng cách sử dụng sys.argv – knittledan

Trả lời

21

này

if __name__ == "__main__": 
    command= " ".join(sys.argv[1:]) 
    eval(command) 

này sẽ làm việc. Nhưng nó cực kỳ nguy hiểm.

Bạn thực sự cần phải suy nghĩ về cú pháp dòng lệnh của bạn là gì. Và bạn cần phải suy nghĩ về lý do tại sao bạn phá vỡ các tiêu chuẩn Linux được thiết lập lâu dài để chỉ định các đối số cho một chương trình.

Ví dụ: bạn nên cân nhắc xóa số () vô ích trong ví dụ của mình. Thay vào đó, hãy làm nó.

python convertImage.py convertFile fileName 

Sau đó, bạn có thể - với công việc ít - sử dụng argparse để có được những lệnh ("convertFile") và các đối số ("fileName") và làm việc trong các tiêu chuẩn cú pháp dòng lệnh Linux.

function_map = { 
    'convertFile': convertFile, 
    'conv': convertFile, 
} 
parser = argparse.ArgumentParser() 
parser.add_argument('command', nargs=1) 
parser.add_argument('fileName', nargs='+') 
args= parser.parse_args() 
function = function_map[args.command] 
function(args.fileName) 
+2

Kết hợp tốt về trả lời ngắn gọn X bằng cách chủ yếu giải quyết Y – Thomas

+0

@ S.Lott Mục đích của hàm dict function_map ở đây là gì? Tại sao nó có hai phím cho lệnh? – Helk

4

nhanh và cách bẩn:

linux user$: python convertImage.py convertFile fileName 

và sau đó trong convertImage.py

if __name__ == '__main__': 
    import sys 
    function = getattr(sys.modules[__name__], sys.argv[1]) 
    filename = sys.argv[2] 
    function(filename) 

Một cách tiếp cận phức tạp hơn sẽ sử dụng argparse (cho 2,7 hoặc 3.2+) hoặc optparse.

+0

argparse cũng ở 2.7 –

+0

@PetrViktorin: Cảm ơn, đã cập nhật. –

0

Tạo một bộ phận thực thi cấp cao nhất của kịch bản của bạn mà phân tích đối số dòng lệnh (s) và sau đó vượt qua nó để chức năng của bạn trong một cuộc gọi, như vậy:

import os, sys 
#import Image 
import string 


def convertFile(fileName): 
    splitName = string.split(fileName, "_") 
    endName = splitName[2] 
    splitTwo = string.split(endName, ".") 
    userFolder = splitTwo[0] 

    imageFile = "/var/www/uploads/tmp/"+fileName 

    print imageFile  # (rest of the script) 

    return 


if __name__ == '__main__': 
    filename = sys.argv[1] 
    convertFile(filename) 

Sau đó, từ một vỏ,

$ convertImage.py the_image_file.png 
/var/www/uploads/tmp/the_image_file.png 
+0

-1 vì không đề xuất sử dụng argparse – Kimvais

+0

điều này có yêu cầu hashbang không? –

Các vấn đề liên quan