2010-09-09 55 views
10

Những gì tôi muốn đạt được là sự ra mắt của lệnh shell sau:Chạy lệnh shell với chuyển hướng đầu vào từ python 2.4?

mysql -h hostAddress -u userName -p userPassword 
databaseName < fileName 

Từ bên trong một con trăn 2.4 kịch bản với một cái gì đó không khác:

cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName, "<", file] 
subprocess.call(cmd) 

này pukes do việc sử dụng các biểu tượng chuyển hướng (tôi tin) - mysql không nhận được tệp đầu vào.

Tôi cũng đã thử:

subprocess.call(cmd, stdin=subprocess.PIPE) 

không đến đó ether

Ai đó có thể xác định cú pháp để thực hiện cuộc gọi vỏ như vậy mà tôi có thể ăn trong một chuyển hướng tập tin?

Xin cảm ơn trước.

+0

bạn nên sử dụng giao diện Python mysql thay vì gọi máy khách mysql bên ngoài – ghostdog74

+0

@ user131527 Giao diện sẽ hoạt động trong trường hợp này là có. Tôi đã quan tâm đến làm thế nào để chuyển hướng các tập tin từ trong python anyway và điều này phục vụ như là một ví dụ tốt – SMTF

Trả lời

11

Bạn phải tự nạp tệp vào mysql stdin. Điều này nên làm điều đó.

import subprocess 
... 
filename = ... 
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName] 
f = open(filename) 
subprocess.call(cmd, stdin=f) 
4

Biểu tượng < có ý nghĩa này (e i.. Đọc một tập tin để stdin) chỉ trong vỏ. Trong Python bạn nên sử dụng một trong hai điều sau đây:

1) đọc nội dung tập tin trong quá trình của bạn và đẩy nó vào stdin của quá trình con:

fd = open(filename, 'rb') 
try: 
    subprocess.call(cmd, stdin=fd) 
finally: 
    fd.close() 

2) đọc nội dung tập tin qua vỏ (như bạn đề cập), nhưng chuyển hướng stdin của quá trình của bạn cho phù hợp:

# In file myprocess.py 
subprocess.call(cmd, stdin=subprocess.PIPE) 

# In shell command line 
$ python myprocess.py < filename 
+1

Chỉnh nhỏ: không có 'với' tuyên bố trong 2.4. – Constantin

+0

@Constantin Cảm ơn. –

+0

Nó có thể liên quan đến cấu hình của tôi nhưng chỉ định subprocess.PIPE như stdin chỉ treo. Đọc như một tập tin làm việc tốt. Cảm ơn! – SMTF

0

Như Andrey nhận thấy một cách chính xác, các nhà điều hành < chuyển hướng được giải thích bởi vỏ. Do đó, một giải pháp khả thi khác:

import os 
os.system("mysql -h " + ip + " -u " + mysqlUser + " " + dbName) 

Nó hoạt động vì os.system chuyển đối số của nó tới trình bao. Lưu ý rằng tôi giả định rằng tất cả các biến được sử dụng đến từ một nguồn đáng tin cậy, nếu không bạn cần xác nhận chúng để ngăn chặn việc thực thi mã tùy ý. Ngoài ra, các biến đó không được chứa khoảng trắng (giá trị mặc định là IFS) hoặc các ký tự đặc biệt.

+0

Điều đó làm cho âm thanh os.system thuận tiện hơn rất nhiều sau đó là tiến trình con. Tôi đã nhầm lẫn khi nghĩ rằng os.system đã không được chấp nhận. Cảm ơn câu trả lời. – SMTF

+0

Vâng, tôi thích giải pháp xử lý con, nó vượt trội trong một số cách (ví dụ: nó phải di động hơn). –

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