2014-11-07 17 views
15

Hôm qua, tôi đã viết và chạy một con trăn script thực hiện một shell bằng cách sử dụng subprocess.Popen(command.split()) trong đó lệnh là chuỗi cấu thành đoạn mã .sh và đối số của nó. Kịch bản này đã hoạt động tốt cho đến ngày hôm qua. Hôm nay, tôi chạy cùng một kịch bản và bây giờ tôi liên tục nhấn lỗi này.subprocess.Popen(): OSError: [Errno 8] Lỗi định dạng Exec trong python?

p=subprocess.Popen(shell_command.split()) 
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child 
raise child_exception 
OSError: [Errno 8] Exec format error 

Tôi biết có những câu hỏi tương tự đã được hỏi trước khi liên quan đến câu hỏi này, nhưng trong trường hợp của tôi, tôi đã thử mọi thứ không giải quyết được mục đích của mình. Sử dụng shell=True không hoạt động vì tập lệnh shell của tôi gọi một tập lệnh shell khác trước khi một số môi trường phải được đặt để chạy tập lệnh đó. Tôi bị mắc kẹt nặng nề trong chuyện này. Tôi chỉ cần khởi động lại hệ thống của tôi một lần. Tôi đang sử dụng ubuntu 12.04

EDIT:

import subprocess 
import os 
import sys 

arg1=sys.argv[1] 
arg2=sys.argve[2] 

shell_command = 'my_path/my_shell.sh ' + arg1 + ' '+ arg2 
P = subprocess.Popen(shell_command.split()) 
P.wait() 

my_shell.sh: nhắn

arg1=$1 
    arg2=$2 

    cd $TOP 
    setup the environment and run shell script 
    build the kernel ... 
    execute shell command ..... 
+0

Bạn đã thử 'import shlex' và sử dụng' shlex.split (shell_command) '? Tài liệu: https://docs.python.org/2/library/shlex.html –

+0

Có, nó cho cùng một lỗi. :( –

+1

Bạn có thể đăng shell_command của mình và phần còn lại của mã (có liên quan) không? Ngoài ra, dòng shebang của tập lệnh của bạn? –

Trả lời

2

Các lỗi cho thấy rằng các chương trình bên ngoài không phải là một thực thi hợp lệ.

3

Như @tripleee đã nói, có sự cố khi thực thi tập lệnh của bạn. Đảm bảo:

  • Thay đổi lệnh trình bao thành "./my_path/my_script.sh" hoặc "/ bin/bash my_path/my_script.sh". Tài khoản cho các biến môi trường, nếu cần thiết.
  • Cả hai tập lệnh đều có bộ bit thực thi (chmod + x)
  • Các tệp tồn tại ở vị trí bạn nghĩ. (Sử dụng abspath hoặc xác minh môi trường)
  • Các tệp có nội dung
  • Thử xóa và nhập lại dòng đầu tiên. Tôi khuyên bạn nên tiêu diệt toàn bộ dòng, và nhấn backspace nhiều lần trong trường hợp có một ký tự không thể in trước số #!

Xem thêm: Why is '#!/usr/bin/env python' supposedly more correct than just '#!/usr/bin/python'?

12

Tuyên bố sau làm việc cho tôi

subprocess.Popen(['sh','my_script.sh'])

+0

Thông báo trước duy nhất với giải pháp này là 'sh' nên ở trong đường dẫn, mà không phải là trường hợp thường. – nyuwec

+0

điều này là thích hợp hơn đối với tôi khi tôi đang làm việc với một kịch bản lệnh shell mà tôi không muốn thay đổi. –

+0

tốt hơn để sử dụng đường dẫn đầy đủ đến trình bao và tập lệnh đặc biệt nếu tập lệnh sẽ được thực thi từ crontab do đó cách ly chính bạn khỏi các thay đổi trong biến môi trường $ PATH của bạn, để wit: subprocess.Popen (['/ bin/bash', '//my_script.sh']) – mcchiz

37

tôi giải quyết này bằng cách đặt dòng này ở phía trên cùng của kịch bản gọi là shell:

#!/bin/sh

Điều đó sẽ gua rantee rằng hệ thống luôn sử dụng trình thông dịch chính xác khi chạy tập lệnh của bạn.

+2

Giải pháp có ý nghĩa hơn đối với tôi, cảm ơn! – Pitto

0

Bạn nên cài đặt gói binfmt-support để giúp hệ thống nhận dạng tốt hơn các scipts. Nó giúp cho dù họ có một dòng shebang hay không.

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