async - Dentro de un script Julia, ¿puede saber si el script se ha importado o ejecutado directamente?
script js (5)
¿Cómo es este código?
if length(PROGRAM_FILE)!=0 && contains(@__FILE__, PROGRAM_FILE)
# do something only this file is executed.
do_something()
end
La función do_something solo se ejecuta cuando se ejecuta el código, no cuando el código se importa de otros códigos.
Una convención común en Python es estructurar la funcionalidad principal de un script de la siguiente manera, para que pueda ejecutarse como un script directamente o importarse sin ejecutar main()
en el momento de la importación:
def main():
do_stuff()
if __name__ == ''__main__'':
main()
¿Existe una variable similar que se establezca en Julia, de modo que el script pueda saber si se importó usando require("script.jl"
) o se ejecutó directamente?
Por ejemplo, digamos que tengo dos scripts, a.jl
y b.jl
, junto con magic_function()
que se comporta de la siguiente manera:
a.jl :
println("Did we execute a.jl directly? ", magic_function())
b.jl :
require("a.jl")
Ejecutando los siguientes comandos resulta en ...
> julia a.jl
Did we execute a.jl directly? true
> julia b.jl
Did we execute a.jl directly? false
¿Existe una función como magic_function()
en la distribución actual de Julia?
Desea la función isinteractive()
. Pruébelo en el REPL, luego compare su resultado con el resultado de llamarlo desde un script como este BASH de una línea: julia -e "println(isinteractive())"
.
Esta es la mejor solución que he encontrado:
module mymod
# stuff here
end
if length(ARGS)>0 && ARGS[1] == "--run"
using mymod
mymod.myfunction()
end
Luego, puede importar el módulo de forma normal, pero puede invocar el comportamiento similar al ejecutable desde la línea de comandos de esta manera:
julia mycode.jl --run
La instrucción if podría acortarse incluso si no tiene otros argumentos para pasar al script:
if ARGS == ["--run"]
# etc...
end
Si bien isinteractive()
le permitirá discernir que el REPL se ejecuta en la línea de comandos / importado en otro código, no hay forma de obtener exactamente la misma funcionalidad que Python''s if __name__ == ''__main__''
.
Esto no parece ser planeado como una característica. Vea esta discusión en la lista de correo . (desde junio de 2013)
yo suelo
if ""!=PROGRAM_FILE && realpath(@__FILE__) == realpath(PROGRAM_FILE)
Parece que se rechazó una solución similar. Me gustaría saber qué hay de malo en eso. Lo estoy usando tanto para algunas pruebas unitarias como para algunos módulos que también son línea de comandos chmod 755
utils
(acaba de agregar el ""!=PROGRAM_FILE
para el caso ''REPL include'', convirtiéndose en un bocado de boca)