2013-03-07 37 views
6

Tôi đang cố gắng lấy tên tệp được cung cấp trong dòng lệnh. Ví dụ:Tên tệp Python stdin

python3 ritwc.py < DarkAndStormyNight.txt

Tôi đang cố gắng để có được DarkAndStormyNight.txt

Khi tôi cố gắng fileinput.filename() tôi nhận được trở lại cùng với sys .stdin. Điều này có thể không? Tôi không tìm kiếm sys.argv [0] trả về tên kịch bản hiện tại.

Cảm ơn!

Trả lời

4

Nói chung nó là không thể để có được những tên tập tin theo một cách nền tảng-agnostic. Các câu trả lời khác bao gồm các lựa chọn thay thế hợp lý như truyền tên trên dòng lệnh.

Trên Linux, và một số hệ thống liên quan, bạn có thể lấy tên của tập tin thông qua việc lừa sau:

import os 
print(os.readlink('/proc/self/fd/0')) 

/proc/là một hệ thống tập tin đặc biệt trên Linux mà cung cấp thông tin về quá trình trên máy tính này. self là quá trình chạy hiện tại (quá trình mở tập tin). fd là một thư mục chứa các liên kết tượng trưng cho mỗi bộ mô tả tệp đang mở trong tiến trình.0 là số mô tả tập tin cho stdin.

+0

Hi nneonneo, bạn có biết tại sao ubuntu của tôi thực sự có đường dẫn '/ proc/self/fd/0' nhưng khi tôi làm' ./test.py 8090PZ

0

Tôi không nghĩ điều đó là có thể. Theo như kịch bản python của bạn là có liên quan nó bằng văn bản để stdout. Thực tế là bạn đang nắm bắt những gì được viết để stdout và ghi nó vào tập tin trong vỏ của bạn không có gì để làm với kịch bản python.

1

Trong thực tế, vì nó seams rằng trăn không thể nhìn thấy tên tập tin rằng khi stdin được chuyển hướng từ giao diện điều khiển, bạn có một sự lựa chọn:

Gọi chương trình của bạn như thế này:

python3 ritwc.py -i your_file.txt 

và sau đó thêm mã sau để chuyển hướng stdin từ bên trong python, để bạn có quyền truy cập vào tên tệp thông qua biến "filename_in":

import sys 

flag=0 
for arg in sys.argv: 
    if flag: 
     filename_in = arg 
     break 
    if arg=="-i": 
     flag=1 
sys.stdin = open(filename_in, 'r') 

#the rest of your code... 

Nếu bây giờ bạn sử dụng đồng mmand:

print(sys.stdin.name) 

bạn lấy tên tệp của mình; tuy nhiên, khi bạn thực hiện lệnh in tương tự sau khi chuyển hướng stdin từ giao diện điều khiển, bạn sẽ nhận được kết quả: <stdin>, đó sẽ là bằng chứng cho thấy python không thể nhìn thấy tên tệp theo cách đó.

1

Bạn có thể sử dụng ArgumentParser, mà automattically cung cấp cho bạn giao diện với các đối số dòng lệnh, và thậm chí cung cấp sự giúp đỡ, vv

from argparse import ArgumentParser 
parser = ArgumentParser()                 
parser.add_argument('fname', metavar='FILE', help='file to process') 
args = parser.parse_args() 

with open(args.fname) as f: 
    #do stuff with f 

Bây giờ bạn gọi python2 ritwc.py DarkAndStormyNight.txt. Nếu bạn gọi python3 ritwc.py không có đối số, nó sẽ đưa ra lỗi khi nói đối số dự kiến ​​cho FILE. Bạn cũng có thể gọi số python3 ritwc.py -h và nó sẽ giải thích rằng yêu cầu file to process.

PS đây là một giới thiệu tuyệt vời trong làm thế nào để sử dụng nó: http://docs.python.org/3.3/howto/argparse.html

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