2015-02-10 39 views
5

Tôi có tập lệnh python đã được đóng gói dưới dạng tập lệnh dòng lệnh (dbtoyaml.py trong số Pyrseas kể từ khi bạn yêu cầu).nhập tập lệnh python từ tập lệnh khác và chạy tập lệnh với đối số

Tôi đang chạy một tập lệnh python khác mà từ đó tôi muốn gọi tập lệnh này. Có cách nào để nhập khẩu các mô-đun và giả tạo cư trú các đối số cần thiết từ kịch bản thứ hai của tôi để tránh thay đổi bất kỳ mã pyrseas ở tất cả?

from pyrseas import dbtoyaml -- My initial script, which also takes arguments dbtoyaml.main(['-m','-H MYHOSTNAME' .... other options])

Chưa làm việc cho tôi.

tôi nhận được một lỗi lạ:

usage: checkSchemaChanges.py [-h] [-H HOST] [-p PORT] [-U USERNAME] [-W] 
         [-c CONFIG] [-r REPOSITORY] [-o OUTPUT] 
         [--version] [-m] [-O] [-x] [-n SCHEMA] 
         [-N SCHEMA] [-t TABLE] [-T TABLE] 
         dbname 
checkSchemaChanges.py: error: unrecognized arguments: MYHOSTNAME mydatabaseuser 

Đó là một hỗn hợp của kịch bản của tôi mới (checkSchemaChanges.py, và myhostname và mydatabaseuser ở phía dưới) và các thông số từ dbtoyaml, mà tất cả đều đúng.

Nó có thể là tập hợp các tham số kép gây nhầm lẫn cho argparse không?

Trả lời

3

này có vẻ như không phải là cách tốt nhất để làm điều đó nhưng có lẽ bạn có thể thiết lập sys.argv

import sys 
sys.argv += ['-m','-H MYHOSTNAME' .... other options] 
from pyrseas import dbtoyaml 
dbtoyaml.main() 

nhưng thực sự tôi không có ý tưởng gì dbtoyaml.py lookslike hoặc là

+0

Điều đó, đã làm việc, nhưng tôi phải thay thế sys.argv, không thêm vào nó, tức là sys.argv = ... cảm ơn –

9

Khi tôi viết một kịch bản dòng lệnh tôi thỉnh thoảng sẽ đặc biệt thiết kế kịch bản của tôi để điều này là có thể. Điều quan trọng là phân tích các arg riêng biệt với hàm chính.

Ví dụ chức năng chính có thể trông như thế này:

def main(**kwargs): 
    # the body of the script goes here 

Sau đó, ở đâu đó trong các mô-đun tôi sẽ cấu hình phân tích cú pháp arg, phân tích args và vượt qua kết quả vào kịch bản chính:

def run(): 
    parser = ... # configure parser here 
    configs = parse_args(parser) 
    main(**configs) 

Bằng cách đó, nếu ai đó muốn gọi tập lệnh từ bên trong Python, họ có thể làm như vậy (nó cũng làm cho thử nghiệm dễ dàng hơn nhiều):

import somescript 
somescript.main(option='value', option2='value2') 

Thật không may, có vẻ như các tác giả của tập lệnh bạn đang sử dụng không làm bất cứ điều gì như thế. Như đã nêu trong câu trả lời khác, bạn có thể ghi đè sys.argv, sau đó nhập tập lệnh. Trong khi đó có thể cảm thấy hacky, nó cần được ít tài nguyên chuyên sâu hơn là mở một quy trình mới và gọi lệnh một cách riêng biệt.

+0

Tôi đã bắt đầu làm điều này và nó đã làm cho kịch bản của tôi linh hoạt hơn và có thể sử dụng lại được. Đề xuất tuyệt vời. – user5359531

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