2011-02-01 23 views
9

Tôi muốn lấy giá trị thực của argv [0] của hệ điều hành trong một chương trình Python. Python sys.argv [0] không phải là giá trị này: nó là tên của tập lệnh Python đang được thực hiện (với một số ngoại lệ). Những gì tôi muốn là một foo.py rằng sẽ in "someString" khi thực hiện nhưLàm thế nào bạn có thể có được argv [0] (không phải sys.argv [0]) của hệ điều hành bằng Python?

Chương trình tầm thường

#! /usr/bin/env python 
import sys 
print sys.argv[0] 

sẽ in "foo.py" để thay thế.

Có ai biết cách nhận điều này không? Có một số hàm liên quan trong API C C: ví dụ: Py_GetProgramName. Nhưng điều này dường như không được tiếp xúc với thế giới Python ở bất cứ đâu. Py_GetProgramFullPath hoạt động tắt của argv [0] nhưng nó cố gắng để có được một đường dẫn đến một trình thông dịch Python. (Giá trị này được truyền cho sys.executable, do đó biến đó không đúng.) Tôi có thực sự phải viết một mô-đun C để có được giá trị này không?

Chỉnh sửa: Cũng được hỏi (nhưng không được trả lời một cách hữu ích) here.

Trả lời

7

Trên Linux, bạn có thể đọc nội dung của /proc/self/cmdline:

#!/usr/bin/env python 
import sys 
print sys.argv[0] 

f = open('/proc/self/cmdline', 'rb') 
cmdline = f.read() 
f.close() 

print repr(cmdline.split('\x00')) 

Và kết quả là:

$ bash 
$ exec -a "somestring" python foo.py 
foo.py 
['somestring', 'foo.py', ''] 

Có vẻ là một lỗi trong bash Lệnh exec thay thế bế mạc vỏ phiên đầu cuối sau khi thông dịch viên thoát. Đó là bash đầu tiên cho.

+0

Nó không phải là một lỗi bash, lệnh 'exec' thay thế vỏ bằng chương trình khác. – interjay

+0

Ooh, đáng sợ. Tôi sẽ không ngạc nhiên nếu điều này có vấn đề về tính di động nhưng nó tốt cho tôi. – pkgw

+0

@interjay Tôi hiểu, cảm ơn! – vz0

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