2012-07-22 31 views
6

Tôi phải nhập tham số từ dòng lệnh, tức là tên người dùng, mật khẩu và tên cơ sở dữ liệu. Tôi biết làm thế nào để làm điều đó mà không cần sử dụng cờ, bằng cách sử dụng 'sys.argv' (như dưới đây).Thêm đối số dòng lệnh với cờ trong Python3

##Test.py 
hostname = str(sys.argv[1]) 
username = str(sys.argv[2]) 
password = str(sys.argv[3]) 

def ConnecttoDB(): 
    try: 
     con=sql.connect(host=hostname, user= username, passwd= password) 
     print ('\nConnected to Database\n') 

# If we cannot connect to the database, send an error to the user and exit the program. 
    except sql.Error: 
     print ("Error %d: %s" % (sql.Error.args[0],sql.Error.args[1])) 
     sys.exit(1) 

    return con 

Vì vậy, nó có thể được chạy như:

$ test.py DATABASE USERNAME pasword

Nhưng vấn đề là tôi phải sử dụng 'cờ'. Vì vậy, các kịch bản có thể được chạy như thế này:

$test.py -db DATABSE -u USERNAME -p PASSWORD -size 20 

Làm thế nào tôi có thể sử dụng lá cờ để có đối số từ dòng lệnh? Tôi sẽ đánh giá cao sự giúp đỡ của bạn về điều này.

Trả lời

6

Trước hết nhờ Mark cho 'argparse' mã. Tôi đã tìm ra cách để lấy đối số từ dòng lệnh được chỉ định bởi cờ. Tôi đang dán mã dưới đây mà sử dụng một 'Mark' mã sửa đổi và một module nhỏ trong đó cho thấy làm thế nào để sử dụng các đối số thu thập thông qua dòng lệnh:

import argparse 

parser = argparse.ArgumentParser() 

#-db DATABASE -u USERNAME -p PASSWORD -size 20000 
parser.add_argument("-host", "--hostname", dest = "hostname", default = "xyz.edu", help="Server name") 
parser.add_argument("-db", "--database", dest = "db", default = "ding_dong", help="Database name") 
parser.add_argument("-u", "--username",dest ="username", help="User name") 
parser.add_argument("-p", "--password",dest = "password", help="Password") 
parser.add_argument("-size", "--binsize",dest = "binsize", help="Size", type=int) 

args = parser.parse_args() 

print("Hostname {} db {} User {} Password {} size {} ".format(
     args.hostname, 
     args.db, 
     args.username, 
     args.password, 
     args.binsize 
     )) 
def ConnectToDB(): 
    print ('Trying to connect to mySQL server') 
    # Try to connect to the database 
    try: 
     con=sql.connect(host=args.hostname, user= args.username, passwd= args.password) 
     print ('\nConnected to Database\n') 

    # If we cannot connect to the database, send an error to the user and exit the program. 
    except sql.Error: 
     print ("Error %d: %s" % (sql.Error.args[0],sql.Error.args[1])) 
     sys.exit(1) 

    return con 

Một trong những mối quan tâm của tôi là làm thế nào để sử dụng các biến từ đối số mã . Vì hai điều đó cần phải được thực hiện

  1. Thêm 'dest' vào dòng add_argument e.x. dest = "username" có nghĩa là giá trị được thu thập từ dòng comamnd sẽ được gán cho biến 'username'
  2. Bất cứ khi nào bạn sử dụng dòng lệnh được gán biến từ 'dest', chỉ cần thêm 'args' trước biến ex con = sql.connect (host = args.hostname, user = args.username, passwd = args.password)

Xong

Cảm ơn

AK

+0

http://docs.python.org/3/library/argparse.html để biết chi tiết – Urhixidur

+7

Bạn đã chấp nhận giải pháp vấn đề của riêng mình, trong khi ** @ Mark ** đã cung cấp cho bạn câu trả lời cho câu hỏi của bạn. Tôi không chắc liệu điều này có tốt không ... – Atcold

31

Thư viện python 3 bao gồm 3 mô-đun để phân tích cú pháp dòng lệnh, do đó không có gì thêm để thêm vào thiết lập của bạn.

Một bạn nên sử dụng là argparse

import argparse 
parser = argparse.ArgumentParser() 

#-db DATABSE -u USERNAME -p PASSWORD -size 20 
parser.add_argument("-db", "--hostname", help="Database name") 
parser.add_argument("-u", "--username", help="User name") 
parser.add_argument("-p", "--password", help="Password") 
parser.add_argument("-size", "--size", help="Size", type=int) 

args = parser.parse_args() 

print("Hostname {} User {} Password {} size {} ".format(
       args.hostname, 
     args.username, 
     args.password, 
     args.size 
     )) 
+0

Cám ơn trả lời và mã của bạn. Vấn đề tôi đang phải đối mặt bây giờ là mã của tôi đang đưa ra lỗi 'Biến không xác định' cho các biến được định nghĩa trong mã trên. Điều này là do, trước đó giá trị của chúng được đề cập rõ ràng bên trong tập lệnh nhưng sau khi bao gồm mã của Mark, các giá trị không được nhận dạng bởi tập lệnh. Trong ngắn hạn làm thế nào để làm cho kịch bản có giá trị của các biến từ mô-đun 'argparse'. Ví dụ: trước đó trong kịch bản: hostname = 127.0.0.1, username = xyz và password = abc nhưng bây giờ chúng được thay thế bằng mã trên (bởi Mark) do đó kịch bản bây giờ nói 'Biến không xác định'. –

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