Как я могу добавить к sys.path с помощью Weblogic Scripting Tools?

#oracle #ant #weblogic #jython #wlst

#Oracle #ant #weblogic #jython #wlst

Вопрос:

Мне нужно логически и неинтерактивно отменить развертывание приложения из Oracle 10. Решение, которое я придумал, заключается в использовании WLST и написании программы на python, которая выполнит всю работу за меня. Проблема, с которой я сталкиваюсь, заключается в манипулировании sys.path вне скрипта.

Я вызываю свой скрипт с помощью пользовательской WLSTTask задачи Ant от Weblogic и передаю определенные аргументы в скрипт через arguments атрибут. Это выглядит так:

 <target name="undeploy-oldest">
    <wlsttask
      debug="true"
      fileName="${basedir}/resources/script/py/undeployOldestApp.py"
      arguments="dmi ${user} ${password} ${url} ${basedir}/resources/script/py/" />
</target>
  

И сам скрипт.

 import sys
from apputil.applist import getAppList
from apputil.apputility import getOldestAppVersion
from wlstModule import connect, disconnect, undeploy

appName = sys.argv[1]
username = sys.argv[2]
password = sys.argv[3]
url = sys.argv[4]

connect(username, password, url)
serverAppList = getAppList()
versionToUndeploy = getOldestAppVersion(appName, serverAppList)
if (versionToUndeploy != -1):
    undeploy(versionToUndeploy)
    print "Undeployed "   versionToUndeploy
else:
    print "Nothing to undeploy"
disconnect()
  

Проблема, с которой я сталкиваюсь, связана с последним аргументом в списке аргументов задачи Ant. У меня создалось впечатление, что Jython добавляет текущий рабочий каталог в sys.path автоматически; хотя, хотя я вижу запись для «.» в sys.path , импорт из моего пользовательского apputil модуля не работает. Я подозреваю, что это связано с тем, откуда на самом деле запускается Ant, и что «.» не представляет каталог, в котором undeployOldestApp.py существует. Я попытался добавить путь к Ant classpath с помощью тега classpath внутри WLSTTask тега, но он не добавил этот путь в sys.path список Jython.

Мой единственный успех до сих пор был в этом последнем аргументе в задаче Ant, где между import sys и from apputil.applist import getAppList я вызываю sys.path.append(sys.argv[5]) . После этого на мои скрипты правильно ссылаются при импорте, и все в порядке. Я бы предпочел, чтобы я устранил эту зависимость и чтобы задача Ant обрабатывала внедрение нужного элемента path. Мне не повезло с этим.

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

Комментарии:

1. Я не пытаюсь ответить на ваш точный вопрос, но предлагаю сделать ваш скрипт надежным. Ваш скрипт может быть вызван из любого места и не обязательно из каталога, в котором он присутствует. Поэтому всегда полезно динамически определять местоположение вашего модуля в скрипте и добавлять sys.path. Например, если местоположение вашего модуля совпадает с местоположением скрипта (в вашем случае это.), то вам просто нужно определить местоположение скрипта и добавить к sys.path таким образом, вы также избежите параметра 5. Я знаю, что это старый пост, просто делюсь своими мыслями 🙂

Ответ №1:

Возможно, вы могли бы использовать параметр executeScriptBeforeFile=»true» и

 <script>
    sys.path.append(...)
</script>
  

В качестве альтернативы вы можете попробовать запустить задачу из java:

 <java classname="weblogic.WLST" fork="true">
    <arg line="${basedir}/resources/script/py/undeployOldestApp.py dmi ${user} ${password} ${url} ${basedir}/resources/script/py/"/>
    <classpath refid="class.path"/>
</java>
  

Это может дать вам доступ к некоторым параметрам задачи Java, которые недоступны в задаче wlsttask.