Найти - Пользователи
Полная версия: Модуль subprocess
Начало » Python для экспертов » Модуль subprocess
1 2 3 4
slivlen
orion
Но перед тем, как работать, мне нужно установить этот “нехороший” батник setenv.bat.
Так запусти его перед выполнением твоего питоновского скрипта, нафига такой изврат творить? =)
slivlen
orion
Но, опять же, его я тоже не могу нормально использовать, так как не знаю, как ту инфу из батника (помнишь, я тебе это описывал на pydev.ru) перенести в мой скрипт.
Может и нам покажешь что же там такое не переносимое написано =)
orion
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
И что тут непереносимо? =)
Почитай эти доки, думаю это прояснит как на 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])
orion
Нет, не прояснило. Ты можешь конкретно дать пример?
orion
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
У меня все работает:
#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
Нашёл свою ошибку. Env всё таки поставил, но получается так, что скрипт, который я запускаю через subprocess, в свою очередь, сам запускает процесс. Как до него дотянуться, чтобы контактировать, не знаю.
slivlen
orion
slivlen, ты не совсем прояснил ситуацию.
Popen создает дочерний процесс и через pipe связывается с его stdin, stdout и stderr, а дочерний процесс наследует окружение родителя. Родителем собственно будет процесс, в котором работает твой скрипт.
orion
Нашёл свою ошибку. Env всё таки поставил, но получается так, что скрипт, который я запускаю через subprocess, в свою очередь, сам запускает процесс. Как до него дотянуться, чтобы контактировать, не знаю.
У тебя shell=True, поэтому сначала запускается шелл, который в свою очередь форкается и запускает на выполнение твой скрипт.
orion
slivlen
У тебя shell=True, поэтому сначала запускается шелл, который в свою очередь форкается и запускает на выполнение твой скрипт.
Так если я использую shell=False, у меня генерит error. То есть другого варианта у меня не имеется :(.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB