2013-01-22 40 views
14

Một quy ước chung trong python là để cấu trúc các chức năng chính của một kịch bản như sau, vì vậy nó có thể được cả hai chạy như một kịch bản trực tiếp hoặc nhập khẩu mà không thực hiện main() tại thời điểm nhập khẩu:Trong tập lệnh Julia, bạn có thể cho biết tập lệnh đã được nhập hoặc thực thi trực tiếp không?

def main(): 
    do_stuff() 

if __name__ == '__main__': 
    main() 

Có biến tương tự được thiết lập trong Julia, sao cho tập lệnh có thể biết liệu nó có được nhập bằng cách sử dụng require("script.jl") hoặc được thực thi trực tiếp không?

Ví dụ, nói tôi có hai kịch bản, a.jlb.jl, cùng với một magic_function() mà ứng xử như sau:

a.jl:

println("Did we execute a.jl directly? ", magic_function()) 

b.jl:

require("a.jl") 

Thực hiện các bước owing lệnh kết quả trong ...

> julia a.jl 
Did we execute a.jl directly? true 
> julia b.jl 
Did we execute a.jl directly? false 

Có chức năng như magic_function() tồn tại trong phân phối hiện tại của Julia không?

Trả lời

1

Bạn muốn có chức năng isinteractive(). Hãy thử nó trong REPL, so sánh kết quả của nó với kết quả của việc gọi nó từ một kịch bản như trong BASH một lót: julia -e "println(isinteractive())".

+2

Điều đó có giống nhau không? 'julia test.jl' trong đó kịch bản đơn giản là' println (isinteractive()) 'sẽ in' false', trong khi 'python test.py' /' print __name__ == '__main __' 'sẽ in' True'. – DSM

+5

Đây không phải là những gì tôi cần: isinteractive() kiểm tra xem nó được thực hiện từ REPL hoặc từ chạy julia my_script.jl, không phải tôi chạy julia my_script.jl hoặc julia script_that_requires_my_script.jl. Cập nhật câu hỏi để rõ ràng. –

5

Trong khi isinteractive() sẽ cho phép bạn phân biệt REPL đang được chạy trên dòng lệnh/được nhập vào mã khác, không có cách nào để có được chính xác chức năng tương tự như của Python if __name__ == '__main__'.

Điều này dường như không được lên kế hoạch làm đối tượng địa lý. Xem này discussion on the mailing list. (Từ tháng Sáu 2013)

3

Đây là giải pháp tốt nhất mà tôi đã tìm thấy:

module mymod 
    # stuff here 
end 

if length(ARGS)>0 && ARGS[1] == "--run" 
    using mymod 
    mymod.myfunction() 
end 

Sau đó, bạn có thể nhập các mô-đun như bình thường, nhưng bạn có thể gọi thực thi như hành vi từ dòng lệnh như thế này:

julia mycode.jl --run 

các câu lệnh if thậm chí có thể được rút ngắn xuống còn này nếu bạn không có lý lẽ khác để vượt qua các kịch bản:

if ARGS == ["--run"] 
    # etc... 
end 
-1

Mã này như thế nào?

if length(PROGRAM_FILE)!=0 && contains(@__FILE__, PROGRAM_FILE) 

# do something only this file is executed. 
do_something() 

end 

Hàm do_something chỉ được thực thi khi mã được thực thi, không phải khi mã được nhập từ các mã khác.

+0

Không hoàn toàn.'PROGRAM_FILE' là' "" 'tại REPL mặc định, và tất cả các chuỗi chứa' "" '. Cũng có thể có những kết quả sai lệch dựa trên đường dẫn khác. –

+0

Ồ, cảm ơn. Matt. Bạn đúng rồi. Tôi đã thay đổi câu trả lời. –

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