2011-01-29 61 views
30
import subprocess 
retcode = subprocess.call(["/home/myuser/go.sh", "abc.txt", "xyz.txt"]) 

Khi tôi chạy những 2 dòng, tôi sẽ được làm chính xác điều này ?:Đây có phải là cách phù hợp để chạy tập lệnh shell bên trong Python không?

/home/myuser/go.sh abc.txt xyz.txt 

Tại sao tôi nhận được lỗi này? Nhưng khi tôi chạy go.sh bình thường, tôi không nhận được lỗi đó.

File "/usr/lib/python2.6/subprocess.py", line 480, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 633, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child 
    raise child_exception 
OSError: [Errno 8] Exec format error 
+7

Liệu shell script của bạn có hashbang có đúng không? – William

+1

Bạn đã bao giờ giải quyết vấn đề này chưa? – Johnsyweb

Trả lời

1

Vâng, đó là hoàn toàn tốt đẹp nếu tất cả các bạn đang làm là kêu gọi các tập lệnh shell, chờ đợi cho nó để hoàn thành, và thu thập trạng thái thoát của nó, trong khi cho phép stdin của nó, stdout, và stderr được thừa hưởng từ Python của bạn quá trình. Nếu bạn cần kiểm soát nhiều hơn bất kỳ yếu tố nào trong số đó, thì bạn chỉ cần sử dụng tổng quát hơn subprocess.Popen, nhưng nếu không thì điều bạn có là tốt.

+1

Bạn có thể cho tôi biết tại sao tôi nhận được lỗi này: OSError: [Errno 8] Lỗi định dạng Exec. Khi tôi chạy nó bình thường thì nó vẫn ổn. – TIMEX

0

Vâng, đây là cách ưa thích để thực hiện một cái gì đó ..

Vì bạn đang đi qua tất cả các đối thông qua một mảng (mà sẽ được sử dụng Gor một exec() - phong cách cuộc gọi trong nội bộ) và không phải là một chuỗi lập luận được đánh giá bởi một trình bao, nó cũng rất an toàn vì việc tiêm các lệnh shell là không thể.

+0

Bạn có thể cho tôi biết tại sao tôi nhận được lỗi này: OSError: [Errno 8] Lỗi định dạng Exec. Khi tôi chạy nó bình thường thì nó vẫn ổn. – TIMEX

+0

Tập lệnh có thể thực thi cho người dùng đang chạy tập lệnh python không? – ThiefMaster

33

OSError: [Errno 8] Exec format error

Đây là lỗi do hệ điều hành báo cáo khi cố gắng chạy /home/myuser/go.sh.

Có vẻ như tôi giống như dòng shebang (#!) của go.sh không hợp lệ.

Dưới đây là một kịch bản mẫu chạy từ vỏ nhưng không phải từ Popen:

#\!/bin/sh 
echo "You've just called $0 [email protected]" 

Loại bỏ các \ từ dòng đầu tiên sửa chữa vấn đề.

+1

Lỗi tương tự cũng xảy ra với tôi, dòng đầu tiên là một số nhận xét bash và sau đó là shebang. Vì vậy, python đã không gửi kịch bản, nhưng khi tôi đặt shebang trên dòng đầu tiên nó làm việc. Bạn có thể giải thích tại sao không? – user1004985

+0

@ user1004985: Dòng shebang *** phải *** là dòng đầu tiên trong tệp. Chắc chắn rồi. – Johnsyweb

11

Thay đổi mã để sau:

retcode = subprocess.call(["/home/myuser/go.sh", "abc.txt", "xyz.txt"], shell=True,) 

Thông báo "shell = True"

Từ: http://docs.python.org/library/subprocess.html#module-subprocess

On Unix, with shell=True: If args is a string, it specifies the command string to execute through the shell. This means that the string must be formatted exactly as it would be when typed at the shell prompt.

1

Tôi chỉ có lỗi này trên Mac OS, trong khi cố gắng gọi tập lệnh một dòng sử dụng subprocess.call. Kịch bản chạy tốt khi được gọi từ dòng lệnh. Sau khi thêm dòng shebang #!/usr/bin/env sh, nó cũng chạy tốt qua subprocess.call.

Nó xuất hiện, trong khi trình bao có trình xử lý mặc định cho tệp văn bản được đánh dấu là có thể thực thi, subprocess.Popen thì không.

2

Gần đây tôi đã chạy vào vấn đề này với một kịch bản trông như thế này:

% cat /tmp/test.sh 
           <-- Note the empty line 
#!/bin/sh 
mkdir /tmp/example 

Kịch bản chạy tốt từ dòng lệnh, nhưng thất bại với

OSError: [Errno 8] Exec format error 

khi được thực thi thông qua

subprocess.Popen(['/tmp/test.sh']).communicate() 

(Giải pháp, tất nhiên, là xóa đường trống).

1
In :call?? 
Signature: call(*popenargs, **kwargs) 
Source: 
def call(*popenargs, **kwargs): 
    """Run command with arguments. Wait for command to complete, then 
    return the returncode attribute. 

    The arguments are the same as for the Popen constructor. Example: 

    retcode = call(["ls", "-l"]) 
    """ 
    return Popen(*popenargs, **kwargs).wait() 
File:  /usr/lib64/python2.7/subprocess.py 
Type:  function 

cuộc gọi chỉ gọi Popen, phương pháp sử dụng wait() chờ các popenargs hoàn

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