Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 2, 2008 14:07:03

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

orion
Но перед тем, как работать, мне нужно установить этот “нехороший” батник setenv.bat.
Так запусти его перед выполнением твоего питоновского скрипта, нафига такой изврат творить? =)



Офлайн

#2 Окт. 2, 2008 14:32:20

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

orion
Но, опять же, его я тоже не могу нормально использовать, так как не знаю, как ту инфу из батника (помнишь, я тебе это описывал на pydev.ru) перенести в мой скрипт.
Может и нам покажешь что же там такое не переносимое написано =)



Офлайн

#3 Окт. 2, 2008 15:10:40

orion
От:
Зарегистрирован: 2008-10-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

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%



Офлайн

#4 Окт. 2, 2008 15:46:32

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

И что тут непереносимо? =)
Почитай эти доки, думаю это прояснит как на Python переписать:
http://weblogs.asp.net/lorenh/archive/2006/03/24/441004.aspx
http://www.ss64.com/nt/set.html
Н-р первая строка заменяется на такое:

# SET SK_PYTHON_HOME=%~dp0%
os.environ['SK_PYTHON_HOME'] = os.path.dirname(sys.argv[0])



Офлайн

#5 Окт. 2, 2008 16:03:34

orion
От:
Зарегистрирован: 2008-10-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Нет, не прояснило. Ты можешь конкретно дать пример?



Офлайн

#6 Окт. 2, 2008 16:32:12

orion
От:
Зарегистрирован: 2008-10-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

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'}

Но, почему-то это не работает, то есть пути не прописываются. Как мне это сделать?



Отредактировано (Окт. 2, 2008 16:38:38)

Офлайн

#7 Окт. 2, 2008 16:56:49

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

У меня все работает:

#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') )



Отредактировано (Окт. 2, 2008 16:58:51)

Офлайн

#8 Окт. 2, 2008 20:18:57

orion
От:
Зарегистрирован: 2008-10-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

Нашёл свою ошибку. Env всё таки поставил, но получается так, что скрипт, который я запускаю через subprocess, в свою очередь, сам запускает процесс. Как до него дотянуться, чтобы контактировать, не знаю.



Офлайн

#9 Окт. 3, 2008 14:25:49

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

orion
slivlen, ты не совсем прояснил ситуацию.
Popen создает дочерний процесс и через pipe связывается с его stdin, stdout и stderr, а дочерний процесс наследует окружение родителя. Родителем собственно будет процесс, в котором работает твой скрипт.
orion
Нашёл свою ошибку. Env всё таки поставил, но получается так, что скрипт, который я запускаю через subprocess, в свою очередь, сам запускает процесс. Как до него дотянуться, чтобы контактировать, не знаю.
У тебя shell=True, поэтому сначала запускается шелл, который в свою очередь форкается и запускает на выполнение твой скрипт.



Офлайн

#10 Окт. 3, 2008 16:37:35

orion
От:
Зарегистрирован: 2008-10-01
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль subprocess

slivlen
У тебя shell=True, поэтому сначала запускается шелл, который в свою очередь форкается и запускает на выполнение твой скрипт.
Так если я использую shell=False, у меня генерит error. То есть другого варианта у меня не имеется :(.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version