使用OS命令创建可执行的python脚本,以启动Blender并运行另一个脚本

时间:2017-05-18 16:41:14

标签: python blender

我需要一点帮助为Blender(Windows和Mac)创建可执行的python OS命令。我正在为客户设置一个独立的搅拌机包。我有一个导入一些数据的python脚本,我想创建一个可执行的python脚本,它运行OS命令来运行Blender,运行python脚本并定义数据目录。

这是我通常运行的Windows命令的通用版本,用于导入数据,使用独立版本的Blender:

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)

根据我的研究,我得知我需要:

  1. import os
  2. 在命令relative
  3. 中创建目录
  4. 创建可执行的python文件
  5. 我的python体验有限,但我相信它可能是这样的:

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

    然而,我看了一下这篇文章,对于这样做的最佳方式有点模糊:

    Calling an external command in Python

    然后我可以使用PyInstaller来创建python可执行文件。这似乎是这里建议的最简单的方法:

    How to make a Python script standalone executable to run without ANY dependency?

    http://www.pyinstaller.org/

    我在这里接近正确的结果吗?我猜我的语法已关闭。我需要确保它适用于Windows和Mac。

    还应该注意的是,我运行的单独python脚本将数据导入blender(我已经使用并更新了几年),是指OS参数来获取所需的数据导入路径,所以我需要确保我保持这种联系。这是一个例子:

    "\n"

    非常感谢任何建议或意见。 克里斯李

2 个答案:

答案 0 :(得分:1)

看起来您要将要使用的所有文件和二进制文件包含在您共享的一个文件夹中。如果您将初始脚本放在该目录的顶部,您应该可以从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)

答案 1 :(得分:0)

使用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文件。我还将版本数据移动到与OS特定的blender目录和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中会有相同的结果。

非常感谢你的帮助。这是我一直在学习的领域,因为我为客户所做的工作远比“过去我”想象的要复杂得多。完成所有这些后,“未来我”会对自己非常满意。