Вы звоните "." командная оболочка. Эта команда означает «выполнить этот файл оболочки в текущем процессе». Вы не можете выполнить файл оболочки в процессе Python, так как Python не является интерпретатором сценария оболочки.
/home/b2v95/sqllib/db2profile
, вероятно, устанавливает некоторые переменные среды оболочки. Если вы прочитаете ее, используя функцию system()
, переменные будут изменены только в исполняемой оболочке и не будут видны в процессе, вызывающем эту оболочку (ваш скрипт).
Вы можете загрузить этот файл только перед запуском сценария Python - вы можете создать сценарий оболочки-оболочки, который будет выполнять . /home/b2v95/sqllib/db2profile
и выполнить сценарий Python.
Другой способ - увидеть, что содержит db2profile
. Если это всего лишь NAME=value
строк, вы можете проанализировать его в своем скрипте Python и обновить os.environ
полученными данными. Если скрипт делает что-то большее (например, вызывает что-то еще для получения значений), вы можете переопределить весь скрипт в Python.
Обновление Идея: прочитать скрипт в python, передать его (используя Popen) в оболочку, после того, как скрипт напишет команду env
в той же оболочке и прочитать вывод. Таким образом, вы получите все переменные, определенные в оболочке. Теперь вы можете читать переменные.
Примерно так:
shell = subprocess.Popen(["sh"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
script = open("/home/db2v95/sqllib/db2profile", "r").read()
shell.stdin.write(script + "\n")
shell.stdin.write("env\n")
shell.stdin.close()
for line in shell.stdout:
name, value = line.strip().split("=", 1)
os.environ[name] = value