slivlen
Окт. 2, 2008 14:07:03
orion
Но перед тем, как работать, мне нужно установить этот “нехороший” батник setenv.bat.
Так запусти его перед выполнением твоего питоновского скрипта, нафига такой изврат творить? =)
slivlen
Окт. 2, 2008 14:32:20
orion
Но, опять же, его я тоже не могу нормально использовать, так как не знаю, как ту инфу из батника (помнишь, я тебе это описывал на pydev.ru) перенести в мой скрипт.
Может и нам покажешь что же там такое не переносимое написано =)
orion
Окт. 2, 2008 15:10:40
slivlen
Может и нам покажешь что же там такое не переносимое написано smile
Да пожалуйста:
@echo off
SET SK_PYTHON_HOME=%~dp0%
SET PATH=%SK_PYTHON_HOME%..\bin;%SK_PYTHON_HOME%;%SK_PYTHON_HOME%LIBS;%SK_PYTHON_HOME%DLLS;%SK_PYTHON_HOME%LIBS;%SK_PYTHON_HOME%Apps\Interactive;%PATH%
SET PYTHONPATH=%SK_PYTHON_HOME%..\bin;%SK_PYTHON_HOME%LIBS;%SK_PYTHON_HOME%DLLS;%SK_PYTHON_HOME%LIBS;%SK_PYTHON_HOME%Apps\Interactive;%PYTHONPATH%
slivlen
Окт. 2, 2008 15:46:32
И что тут непереносимо? =)
Почитай эти доки, думаю это прояснит как на Python переписать:
http://weblogs.asp.net/lorenh/archive/2006/03/24/441004.aspxhttp://www.ss64.com/nt/set.htmlН-р первая строка заменяется на такое:
# SET SK_PYTHON_HOME=%~dp0%
os.environ['SK_PYTHON_HOME'] = os.path.dirname(sys.argv[0])
orion
Окт. 2, 2008 16:03:34
Нет, не прояснило. Ты можешь конкретно дать пример?
orion
Окт. 2, 2008 16:32:12
slivlen, ты не совсем прояснил ситуацию. Я работаю с модулем popen:
step1 = subprocess.Popen('Create.py', shell = True,
stdout = subprocess.PIPE,
stdin = subprocess.PIPE,
cwd = ‘C:\Program Files\Program\Training’,
env =
)
Видишь, именно в нём мне нужно задать этот env. Насколько я понял, в виде приблизительно такого списка:
env = {'PATH':'C:\Program Files\Sk\Beal\bin; C:\Program Files\Sk\Beal\Python;C:\Program Files\Sk\Beal\Python\LIBS;C:\Program Files\Sk\Beal\Python\DLLS;C:\Program Files\Sk\Beal\Python\LIBS;C:\Program Files\Sk\Beal\Python\Apps\Interactive',
‘PYTHONPATH’:'C:\Program Files\Sk\Beal\bin;C:\Program Files\Sk\Beal\Python\LIBS;C:\Program Files\Sk\Beal\Python\DLLS;C:\Program Files\Sk\Beal\Python\LIBS;C:\Program Files\Sk\Beal\Python\Apps\Interactive'}
Но, почему-то это не работает, то есть пути не прописываются. Как мне это сделать?
shiza
Окт. 2, 2008 16:56:49
У меня все работает:
#coding=utf-8
import subprocess
#словарь с переменными окружения
env = {'PATH':'C:\Program Files\Sk\Beal\bin; C:\Program Files\Sk\Beal\Python;C:\Program Files\Sk\Beal\Python\LIBS;C:\Program Files\Sk\Beal\Python\DLLS;C:\Program Files\Sk\Beal\Python\LIBS;C:\Program Files\Sk\Beal\Python\Apps\Interactive',
'PYTHONPATH':'C:\Program Files\Sk\Beal\bin;C:\Program Files\Sk\Beal\Python\LIBS;C:\Program Files\Sk\Beal\Python\DLLS;C:\Program Files\Sk\Beal\Python\LIBS;C:\Program Files\Sk\Beal\Python\Apps\Interactive'}
#выполняем скрипт, с установленными переменными окружения
step1 = subprocess.Popen('Create.py', shell = True,
stdout = subprocess.PIPE,
stdin = subprocess.PIPE,
env = env
).communicate()
В выполняемом файле убеждаемся, что уставноленны нужные нам переменные окружения:
Create.py:
#coding=utf-8
import os
#сохраним в файл переменные окружения PATH и PYTHONPATH
file('env.txt','w').write( os.getenv('PATH') + '\r\n' + os.getenv('PYTHONPATH') )
orion
Окт. 2, 2008 20:18:57
Нашёл свою ошибку. Env всё таки поставил, но получается так, что скрипт, который я запускаю через subprocess, в свою очередь, сам запускает процесс. Как до него дотянуться, чтобы контактировать, не знаю.
slivlen
Окт. 3, 2008 14:25:49
orion
slivlen, ты не совсем прояснил ситуацию.
Popen создает дочерний процесс и через pipe связывается с его stdin, stdout и stderr, а дочерний процесс наследует окружение родителя. Родителем собственно будет процесс, в котором работает твой скрипт.
orion
Нашёл свою ошибку. Env всё таки поставил, но получается так, что скрипт, который я запускаю через subprocess, в свою очередь, сам запускает процесс. Как до него дотянуться, чтобы контактировать, не знаю.
У тебя shell=True, поэтому сначала запускается шелл, который в свою очередь форкается и запускает на выполнение твой скрипт.
orion
Окт. 3, 2008 16:37:35
slivlen
У тебя shell=True, поэтому сначала запускается шелл, который в свою очередь форкается и запускает на выполнение твой скрипт.
Так если я использую shell=False, у меня генерит error. То есть другого варианта у меня не имеется :(.