Hướng dẫn python run another python script with arguments - python chạy tập lệnh python khác có đối số

Tôi muốn chạy một kịch bản Python từ một kịch bản Python khác. Tôi muốn vượt qua các biến như tôi sẽ sử dụng dòng lệnh.

Ví dụ: tôi sẽ chạy tập lệnh đầu tiên của mình để lặp lại thông qua danh sách các giá trị (0,1,2,3) và chuyển chúng sang tập lệnh thứ 2 script2.py 0 sau đó

os.system("script2.py 1")
0, v.v.

Tôi đã tìm thấy Stack & nbsp; Overflow Câu 1186789 là một câu hỏi tương tự, nhưng câu trả lời của ARS gọi một hàm, trong đó tôi muốn chạy toàn bộ tập lệnh, không chỉ là một hàm và câu trả lời của Balpha gọi tập lệnh mà không có tranh luận. Tôi đã thay đổi điều này thành một cái gì đó như bên dưới như một bài kiểm tra:

execfile("script2.py 1")

Nhưng nó không chấp nhận các biến đúng cách. Khi tôi in ra

os.system("script2.py 1")
1 trong script2.py, đó là lệnh gọi lệnh gốc đến tập lệnh đầu tiên "['C: \ script1.py'].

Tôi không thực sự muốn thay đổi tập lệnh gốc (tức là script2.py trong ví dụ của tôi) vì tôi không sở hữu nó.

Tôi nghĩ rằng phải có một cách để làm điều này; Tôi chỉ bối rối cách bạn làm điều đó.

Hướng dẫn python run another python script with arguments - python chạy tập lệnh python khác có đối số

Được hỏi ngày 23 tháng 9 năm 2010 lúc 19:31Sep 23, 2010 at 19:31

Gern Blanstongern BlanstonGern Blanston

42.3K19 Huy hiệu vàng49 Huy hiệu bạc64 Huy hiệu đồng19 gold badges49 silver badges64 bronze badges

8

Hãy thử sử dụng

os.system("script2.py 1")
2:

os.system("script2.py 1")

os.system("script2.py 1")
3 là khác nhau vì nó được thiết kế để chạy một chuỗi các câu lệnh Python trong bối cảnh thực hiện hiện tại. Đó là lý do tại sao
os.system("script2.py 1")
1 không thay đổi cho bạn.

Đã trả lời ngày 23 tháng 9 năm 2010 lúc 19:33Sep 23, 2010 at 19:33

Greg Hewgillgreg HewgillGreg Hewgill

916K178 Huy hiệu vàng1133 Huy hiệu bạc1267 Huy hiệu đồng178 gold badges1133 silver badges1267 bronze badges

16

Lý tưởng nhất là tập lệnh Python bạn muốn chạy sẽ được thiết lập với mã như thế này gần cuối:

def main(arg1, arg2, etc):
    # do whatever the script does


if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2], sys.argv[3])

Nói cách khác, nếu mô -đun được gọi từ dòng lệnh, nó phân tích các tùy chọn dòng lệnh và sau đó gọi một hàm khác,

os.system("script2.py 1")
5, để thực hiện công việc thực tế. (Các đối số thực tế sẽ khác nhau và phân tích cú pháp có thể liên quan nhiều hơn.)

Tuy nhiên, nếu bạn muốn gọi một tập lệnh như vậy từ một tập lệnh Python khác, bạn chỉ cần

os.system("script2.py 1")
6 và gọi trực tiếp
os.system("script2.py 1")
7, thay vì đi qua hệ điều hành.

os.system("script2.py 1")
2 sẽ hoạt động, nhưng đó là cách đường vòng (đọc "chậm") để làm điều đó, vì bạn đang bắt đầu một quy trình phiên dịch Python hoàn toàn mới mỗi lần không có nho khô.

Đã trả lời ngày 23 tháng 9 năm 2010 lúc 23:19Sep 23, 2010 at 23:19

8

Đây vốn là điều sai để làm. Nếu bạn đang chạy tập lệnh Python từ một tập lệnh Python khác, bạn nên giao tiếp qua Python thay vì thông qua HĐH:

import script1

Trong một thế giới lý tưởng, bạn sẽ có thể gọi một chức năng bên trong

os.system("script2.py 1")
9 trực tiếp:

for i in range(whatever):
    script1.some_function(i)

Nếu cần thiết, bạn có thể hack

os.system("script2.py 1")
1. Có một cách gọn gàng để làm điều này bằng cách sử dụng Trình quản lý ngữ cảnh để đảm bảo rằng bạn không thực hiện bất kỳ thay đổi vĩnh viễn nào.

import contextlib
@contextlib.contextmanager
def redirect_argv(num):
    sys._argv = sys.argv[:]
    sys.argv=[str(num)]
    yield
    sys.argv = sys._argv

with redirect_argv(1):
    print(sys.argv)

Tôi nghĩ rằng điều này là tốt hơn để chuyển tất cả dữ liệu của bạn cho HĐH và trở lại; Đó chỉ là ngớ ngẩn.

Đã trả lời ngày 23 tháng 9 năm 2010 lúc 19:43Sep 23, 2010 at 19:43

Hướng dẫn python run another python script with arguments - python chạy tập lệnh python khác có đối số

KatrielkatrielKatriel

117K19 Huy hiệu vàng133 Huy hiệu bạc165 Huy hiệu Đồng19 gold badges133 silver badges165 bronze badges

11

Tôi nghĩ rằng thực hành tốt có thể là một cái gì đó như thế này;

import subprocess
cmd = 'python script.py'

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
out, err = p.communicate() 
result = out.split('\n')
for lin in result:
    if not lin.startswith('#'):
        print(lin)

Theo tài liệu, mô -đun phụ cho phép bạn sinh ra các quy trình mới, kết nối với đường ống đầu vào/đầu ra/lỗi của chúng và có được mã trả lại của chúng. Mô -đun này dự định thay thế một số mô -đun và chức năng cũ hơn:

os.system
os.spawn*
os.popen*
popen2.*
commands.*

Sử dụng Truyền thông () chứ không phải .Stdin.Write, .stdout.read hoặc .stderr.read để tránh bế tắc do bất kỳ bộ đệm ống hệ điều hành nào khác lấp đầy và chặn quy trình con. Đọc ở đây

Đã trả lời ngày 29 tháng 10 năm 2014 lúc 8:47Oct 29, 2014 at 8:47

MedhatmedhatMedhat

1.58415 huy hiệu bạc31 huy hiệu đồng15 silver badges31 bronze badges

0

import subprocess
subprocess.call(" python script2.py 1", shell=True)

Duncan Jones

65.1K28 Huy hiệu vàng185 Huy hiệu bạc246 Huy hiệu đồng28 gold badges185 silver badges246 bronze badges

Đã trả lời ngày 12 tháng 11 năm 2013 lúc 12:06Nov 12, 2013 at 12:06

NikosnikosNikos

3973 Huy hiệu bạc2 Huy hiệu Đồng3 silver badges2 bronze badges

3