2016-01-30 25 views
11

Đối với những người không quen thuộc với ~/.bashrc, đó là tập lệnh có thể tùy chỉnh tồn tại cho vỏ Unix Bash. Khi một phiên thiết bị đầu cuối mới bắt đầu, tệp người dùng cụ thể này sẽ chạy. Người dùng có thể viết các biến chung, các hàm và các thiết lập môi trường trong tệp này và do đó có chúng tự động được nạp bất cứ khi nào chúng mở một cửa sổ đầu cuối.Python tương đương với ~/.bashrc

Có điều gì đó tương tự tồn tại cho Python không? Về cơ bản tôi muốn định nghĩa một số hàm Python toàn cục trong một kịch bản lệnh và đảm bảo rằng chúng được nạp bất cứ khi nào tôi chạy một kịch bản Python trên máy tính của tôi, hoặc bất cứ khi nào tôi bắt đầu một thiết bị đầu cuối Python. Tôi tự hỏi nếu hành vi này đã tồn tại, hoặc nếu có một cách thẳng về phía trước để thực hiện nó.

+0

Xem ['__init __. Py'] (http://stackoverflow.com/questions/448271/what-is-init-py-for). – e0k

+3

Chạy cho mọi tập lệnh Python không phải là hành vi được hỗ trợ ('__init __. Py' có thể được sử dụng để đảm bảo mã nhất định được chạy nếu một gói hoặc con của nó được nhập), nhưng để tùy chỉnh trình thông dịch tương tác, hãy đặt' PYTHONSTARTUP' biến môi trường để trỏ đến một tệp có lệnh Python để chạy trước khi chuyển sang trình thông dịch tương tác, ví dụ 'xuất PYTHONSTARTUP = $ HOME/.pythonrc'. – ShadowRanger

+1

Xem https://docs.python.org/2/library/site.html –

Trả lời

5

Chạy cho mỗi kịch bản Python không phải là một ý tưởng tốt vì nó phá vỡ không gian tên; trên Zen of Python:

Không gian tên là một ý tưởng tuyệt vời - hãy làm nhiều hơn!

Điều đó nói rằng, __init__.py thể được sử dụng để đảm bảo mã nào đó được chạy nếu một gói hoặc con của nó được nhập khẩu, và để tùy chỉnh thông dịch viên tương tác, thiết lập biến PYTHONSTARTUP môi trường để trỏ đến một tập tin với lệnh Python để chạy trước khi giao cho người phiên dịch tương tác, vd export PYTHONSTARTUP=$HOME/.pythonrc.

Chỉ cần đảm bảo tệp PYTHONSTARTUP chứa cú pháp pháp cho cả Py2 và Py3 vì không có PYTHON3STARTUP, nó sẽ được chạy cho cả hai phiên bản của Python.

5

Đây là một ý tưởng tồi - đừng làm điều đó. Có thật không. (Ô nhiễm không gian tên là một vấn đề nghiêm trọng, và bạn không có bất kỳ ưu đãi nào bằng cách viết mã chỉ hoạt động trên máy của riêng bạn và không ở đâu khác, ngược lại, nếu bạn đóng gói mã của bạn trong một mô-đun, bạn có thể xuất bản và phân phối nó đúng cách).

Tuy nhiên, nếu bạn cứ khăng khăng, xem the site module, và đặc biệt là hành vi sử dụng tùy biến của nó:

Sau đó, một nỗ lực được thực hiện để nhập khẩu một module có tên usercustomize, mà có thể thực hiện các tùy chỉnh sử dụng cụ thể tùy ý, nếu ENABLE_USER_SITE là đúng. Tệp này được dự định sẽ được tạo trong thư mục gói trang web của người dùng (xem bên dưới), là một phần của sys.path trừ khi bị vô hiệu hóa theo số -s. An ImportError sẽ bị bỏ qua âm thầm.

Vì vậy, bạn có thể tạo mô-đun usercustomize nóng lên nội dung trái tim của bạn.


Như một ví dụ về hotpatching ví dụ:

def myfunc(): 
    print 'hello' 

main_ns = __import__('__main__') 
main_ns.myfunc = myfunc 
+0

um! nếu có một số chức năng hệ thống ngắn cụ thể như một số lệnh batch, vẫn còn xấu? – Ja8zyjits

+0

Hình thức ngắn: Có, xấu. "Rõ ràng là tốt hơn là ngầm" là một phần của Python Way - nếu bạn đang sử dụng một cái gì đó địa phương, nó nên được rõ ràng rằng bạn đang thay vì ngầm hiện diện trong tất cả các không gian tên. –

+1

... nếu bạn muốn một cái gì đó chỉ là một phần mở rộng cho vỏ địa phương, có thể sử dụng IPython và cơ chế mở rộng của nó? Bằng cách đó, bạn ít nhất không can thiệp vào hành vi của các tập lệnh. Xem http://ipython.readthedocs.org/en/stable/config/extensions/index.html –

4

Về cơ bản tôi muốn xác định một số ít các chức năng Python toàn cầu trong một kịch bản và đảm bảo rằng họ được nạp bất cứ khi nào tôi chạy một kịch bản python trên máy của tôi, hoặc bất cứ khi nào tôi bắt đầu một thiết bị đầu cuối Python

Hãy nói về lựa chọn thứ hai của bạn. Có nhiều cách để tải các hàm và biến khi bạn khởi động một thiết bị đầu cuối. Tôi khuyên bạn nên sử dụng IPython thay vì thiết bị đầu cuối Python mặc định.Tuy nhiên, để thực hiện việc này mà không cần cài đặt IPython, hãy sửa đổi biến môi trường PYTHONSTARTUP. Bạn mất khả năng chia nhỏ các tệp cấu hình của mình.

Khi bạn cài đặt IPython, bạn sẽ cần phải khởi tạo các tệp cấu hình của nó. Để tạo cấu hình mặc định:

ipython profile create 

Để giải quyết những chủ đề phổ biến trong các câu trả lời khác, các biến và chức năng toàn cầu là một ý tưởng tồi đặc biệt là nếu họ đang ngầm được xác định. Tuy nhiên, bạn có thể xác định và tải các tệp cấu hình riêng biệt khi khởi động ipython. Để tạo một hồ sơ như:

ipython profile create <name> 

Để tải hồ sơ cá nhân <name>:

ipython --profile=<name> 

Bây giờ để sửa đổi các tập tin cấu hình. Chạy lệnh này để xem chúng ở đâu:

ipython locate profile 

Bạn nên tìm thấy ipython_config.py. Tôi muốn đề nghị đọc nó, nó có ý kiến ​​rất hữu ích.

Nhưng để có được điểm, bạn có thể tải chức năng tùy ý và các biến khi bắt đầu ipython bằng cách thêm những dòng này vào tập tin cấu hình:

c.InteractiveShellApp.exec_lines = [ "def p(s): print s" ] 
c.InteractiveShellApp.exec_files = [ "/path/of/script.py" ] 

Tôi đang tham khảo the IPython docs và các ý kiến ​​trong ipython_config.py:

96 # List of files to run at IPython startup.          
97 # c.TerminalIPythonApp.exec_files = []           
98                     
99 # lines of code to run at IPython startup.          
100 # c.TerminalIPythonApp.exec_lines = [] 
Các vấn đề liên quan