Создание исполняемого скрипта Python с командами ОС для запуска Blender и запуска другого скрипта

Мне нужна небольшая помощь в создании исполняемой команды ОС Python для Blender (Windows и Mac). Я настраиваю автономный пакет блендера для использования клиентом. У меня есть скрипт Python, который импортирует некоторые данные, и я хочу создать исполняемый скрипт Python, который запускает команды ОС для запуска Blender, запуска скрипта Python и определения каталогов данных.

Это общая версия команды Windows, которую я обычно запускаю для импорта данных, используя автономную версию Blender:

"C:\Users\username\Desktop\Package\system\blender\blender.exe" "C:\Users\username\Desktop\Package\system\version_data\CurrentVersion.blend" -P "C:\Users\username\Desktop\Package\system\version_data\BlenderScript.py" "C:\Users\username\Desktop\Package\input_data\\" -y

Из моих исследований я понял, что мне нужно:

  1. импорт ОС
  2. сделать каталоги в команде относительными
  3. создать исполняемый файл python

Мой опыт работы с Python ограничен, но я думаю, что это может быть что-то вроде этого:

import os

pythonDirectory = os.path.dirname(os.path.abspath(RunThisApp.exe))  # get the current dir of this file (which would be: C:\Users\username\Desktop\Package\)

os.path.join(pathDirectory, "//system\blender\blender.exe" "//system\version_data\CurrentVersion.blend" -P "//system\version_data\BlenderScript.py" "//input_data\\" -y)

Однако я просмотрел этот пост и немного не понял, как лучше всего это сделать:

Вызов внешней команды в Python

Тогда я мог бы использовать PyInstaller для создания исполняемых файлов Python. Кажется, это самый простой метод, предложенный здесь:

Как создать скрипт Python автономный исполняемый файл для запуска без ЛЮБОЙ зависимости?

http://www.pyinstaller.org/

Я близок к правильному результату здесь? Я предполагаю, что мой синтаксис отключен. Мне нужно убедиться, что он работает как для Windows, так и для Mac.

Следует также отметить, что отдельный скрипт Python, который я запускаю для импорта данных в блендер (который я использую и обновляю в течение нескольких лет), обращается к аргументам ОС, чтобы получить желаемый путь данных для импорта, поэтому мне нужно убедитесь, что я поддерживаю эту связь. Вот пример:

IMPORT_DATA_FILENAME = sys.argv[4]+'data.txt' 

Любые советы или вход будет принята с благодарностью. Крис Ли


person Chris Lee    schedule 18.05.2017    source источник
comment
"//system\blender\blender.exe": плохой выбор: \b — это возврат. Используйте префикс r.... какой у вас вопрос???   -  person Jean-François Fabre    schedule 18.05.2017
comment
Этот ответ делает то, что вы пытаетесь, не уверен на 100%, что он работает в Windows, и комментарий указывает на необходимость настройки для оскс. Вы можете проверить, в какой системе работаете, и при необходимости использовать разные пути к исполняемым файлам.   -  person sambler    schedule 19.05.2017
comment
@ Жан-Франсуа Фабр, я не понял твоего ответа. Не должны ли пути быть написаны так? Как бы вы написали такой путь? На самом деле мой вопрос был просто: использую ли я лучший метод для получения желаемого результата в нескольких операционных системах.   -  person Chris Lee    schedule 23.05.2017
comment
В Windows путь использует обратную косую черту - в обычной строке, которая заставляет \b интерпретироваться как управляющая последовательность, представляющая возврат, например, \n является новой строкой. Вы добавляете префикс r к строке, как в r"//system\blender\blender.exe", чтобы указать, что это необработанная строка, чтобы предотвратить интерпретацию обратной косой черты таким образом. Подробнее читайте здесь. Вы также можете использовать os.path.join, чтобы не использовать разделители пути в строке.   -  person sambler    schedule 23.05.2017
comment
Спасибо, что разъяснили это. Я видел, что os.path.join выглядел как лучшее решение, но не понимал, что мне нужно создать необработанную строку при использовании стандартных путей.   -  person Chris Lee    schedule 23.05.2017


Ответы (2)


Похоже, что все файлы и двоичные файлы, которые вы хотите использовать, включены в одну папку, которой вы делитесь. Если вы поместите первоначальный скрипт в верхнюю часть этого каталога, вы сможете получить его местоположение из argv[0] и вычислить местоположение других файлов, которые вы хотите, из этого, что должно позволить пользователю перемещать папку вашего пакета куда угодно.

Вы можете использовать platform.system(), чтобы добавить любые специфичные для системы варианты в пути.

#!/usr/bin/env python3

import os
from sys import argv
from platform import system
from subprocess import call

# define the package dir as the dir that this script is in
pkg_dir = os.path.abspath(os.path.dirname(argv[0]))
# use a package dir in the users home folder
#pkg_dir = os.path.join(os.path.expanduser('~'), 'Package')
# use a package dir in the users desktop folder
#pkg_dir = os.path.join(os.path.expanduser('~'), 'Desktop', 'Package')
sys_dir = os.path.join(pkg_dir, system())
vers_dir = os.path.join(pkg_dir,'version_data')
blend = os.path.join(vers_dir, 'CurrentVersion.blend')
script = os.path.join(vers_dir, 'BlenderScript.py')

if system() == 'Windows':
    blender_exe = os.path.join(sys_dir, 'blender', 'blender.exe')
elif system() == 'Darwin':
    blender_exe = os.path.join(sys_dir, 'blender', 'blender.app',
                                'Contents', 'MacOS', 'blender')
else:
    # linux?
    blender_exe = os.path.join(sys_dir, 'blender', 'blender')

calllist = [
    blender_exe,
    blend,
    '--python',
    script,
    ]

call(calllist)
person sambler    schedule 19.05.2017
comment
Похоже, что все файлы и двоичные файлы, которые вы хотите использовать, включены в одну папку, к которой вы предоставляете общий доступ. Если вы поместите первоначальный скрипт в верхнюю часть этого каталога, вы сможете получить его местоположение из argv[0] и вычислить местоположение других файлов, которые вы хотите, из этого, что должно позволить пользователю перемещать папку вашего пакета в любое место. хочу. Да Sambler, это именно то, что я пытаюсь сделать. - person Chris Lee; 23.05.2017
comment
Sambler Я столкнулся с проблемой и с некоторой помощью понял, где я ошибся. Часть if system() идентифицирует систему, а затем ищет каталог с тем же именем. У меня только что был каталог с именем system, но логично, что у меня должен быть каталог для Windows и Mac. Означает ли это, что версия для Mac должна находиться в каталоге Darwin? - person Chris Lee; 23.05.2017
comment
Я не собираюсь настраивать это для Linux, но если я это сделаю, будут ли файлы храниться в каталоге с именем system? - person Chris Lee; 23.05.2017
comment
system() должно возвращать 'Linux', 'Darwin' или 'Windows'. См. эту страницу для получения дополнительной информации о том, что вы получаете Платформа. Я думаю, что использование этого значения для имени папки, содержащей двоичные файлы каждой системы, было бы самым простым. - person sambler; 23.05.2017

Используя решение Sambler, я немного изменил его, чтобы получить следующее решение:

import os
from sys import argv
from platform import system
from subprocess import call

# define the package dir as the dir that this script is in
pkg_dir = os.path.abspath(os.path.dirname(argv[0]))

sys_dir = os.path.join(pkg_dir, 'private_sys', system())
vers_dir = os.path.join(pkg_dir, 'private_sys', '#version_data')
blend = os.path.join(vers_dir, 'CurrentVersion.blend')
script = os.path.join(vers_dir, 'BlenderScript.py')
input = os.path.join(pkg_dir, 'input_data')

if system() == 'Windows':
    blender_exe = os.path.join(sys_dir, 'blender', 'blender.exe')
elif system() == 'Darwin':
    blender_exe = os.path.join(sys_dir, 'blender', 'blender.app', 'Contents', 'MacOS', 'blender')

calllist = [
    blender_exe,
    blend,
    '--python',
    script,
    input,
    ]

call(calllist)

Чтобы уточнить, в каталоге Package структура папок выглядит следующим образом:

+---input_data 
    \---data.txt
    \---input.blend
\---private_sys
    +---#version_data
        \---BlenderScript.py
        \---CurrentVersion.blend
    +---Darwin
    |   \---blender
    \---Windows
        \---blender

Помимо удаления Linux и других предложенных вариантов, я добавил входной каталог. Вызванный BlenderScript.py ссылается на файлы data.txt и input.blend и импортирует их в файл CurrentVersion.blend. Я также переместил данные версии в отдельный каталог из каталогов блендера для конкретной ОС и внутри каталога private_sys, чтобы пользователю не приходилось видеть эти файлы.

Последним препятствием были такие строки внутри BlenderScript.py:

IMPORT_DATA_FILENAME = sys.argv[4]+'data.txt' 

Проблема заключалась в том, что я получал сообщение об ошибке, потому что скрипт в конечном итоге искал: «\ input_datadata.txt».

Я исправил это, изменив его на:

IMPORT_DATA_FILENAME = sys.argv[4]+'/data.txt' 

Что возвращает: "\input_data/data.txt". Я предполагаю, что это будет иметь тот же результат в OSX.

Большое спасибо за Вашу помощь. Это та область, в которой я постоянно узнаю больше, поскольку работа, которую я делаю для клиента, намного сложнее, чем мог себе представить «прошлый». «Будущий я» будет очень доволен собой, когда все это будет сделано.

person Chris Lee    schedule 23.05.2017
comment
В конце концов я заставил pyinstaller работать, как только понял, что он еще не совместим с Python 3.6, и перешел на Python 3.5. Теперь он работает по назначению. Завтра попробую Мак. - person Chris Lee; 23.05.2017