2015-04-08 5 views
3

Я пытаюсь создать скрипт Python для выполнения других сценариев Python, и он работает на большинстве скриптов, но не удастся, когда он встретит print('anything', end=''). Это связано с тем, что подпроцесс работает 2,7, а не 3,4. Я не могу для жизни меня выяснить, как запустить подпроцесс 3.4.Подпроцесс Python запускает другую версию Python

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (In 
tel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> import subprocess 
>>> sys.version 
'3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)]' 
>>> results = subprocess.check_output('testprint.py', shell=True) 
>>> results 
b'2.7 (r27:82525, Jul 4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)]\r\n' 

testprint.py только это:

import sys 
print(sys.version) 

Edit: И, конечно, я бы реализовать решение после размещения вопроса. Я изменил код на следующее:

path = r'C:\Python34\python.exe' 
results = subprocess.check_output([path, 'testprint.py'], shell=True) 

Теперь я передаю исполняемый путь, через который будет проходить сценарий. Тем не менее, я хотел бы получить более элегантное и постоянное решение.

+0

Я не очень опытен с этим модулем, но задаюсь вопросом, предназначено ли оно для использования 2.7 ... http://stackoverflow.com/questions/11170827/how-tell-python-script-to-use-particular -version – picus

+0

Каково поведение при запуске testprint.py из командной строки без указания исполняемого файла python? – horns

+0

Я собирался предложить execfile, но потом понял, что был удален (хотя вы можете посмотреть http://stackoverflow.com/questions/6357361/alternative-to-execfile-in-python-3-2). – Foon

ответ

3

Одно решение сделать:

import sys 
import subprocess 

subprocess.call([sys.executable, 'testprint.py']) 

sys.executable является расположение питона двоичный код работает выполняющийся. Обратите внимание, что по какой-то причине shell=True запускает двоичный код python без каких-либо аргументов на sys.argv, поэтому либо опустите эту опцию, либо используйте строку или shlex.quote. Это фактически то же самое, что и ваше решение, но исполняемая позиция не жестко закодирована.

Смежные вопросы