2016-03-31 3 views
0

Насколько я использую Джулию, у меня сложилось впечатление, что импорт пакетов может быть выполнен только на верхнем уровне. Однако кто-нибудь нашел сложный/неофициальный способ сделать работу ниже? В принципе, я хочу условно импортировать пакет. Если пакет установлен, я хочу его импортировать, но если он не установлен, я не хочу его включать (поэтому Julia не будет автоматически его устанавливать).Импорт пакетов верхнего уровня

if Pkg.installed("my_package") != Void import my_package else ## DO NOT IMPORT my_package end

Я понимаю, что это невозможно, но учитывая то, как быстро меняется Джулия, я не удивлюсь, если там был новый способ сделать это.

ответ

2

Как вы сказали Pkg.installed() возвратят Пустоты типа, если пакет не installed.So вы можете создать функцию, чтобы сделать эту проверку для вас:

function load_if_installed(package_name) 
    if typeof(Pkg.installed(package_name)) == Void 
    println("package is not installed") 
    else 
    # load in package after parsing command 
    eval(parse("using $package_name")) 
end 
end 

load_if_installed("PyPlot") 
> 
load_if_installed("AWS") 
> package is not installed 

Пробовал это с Джулией 0.4.5 AWS не установлены и PyPlot. Проверьте metaprogramming section для получения информации о том, как работают функции eval() и parse().

+0

Аккуратный трюк; Я использую метапрограммирование все время, но я не думал об обертывании выражения в 'parse', а затем использовал глобальную область' eval', чтобы заставить его работать! Благодаря! –

Смежные вопросы