我创建了一个Docker镜像,可以从Node.js调用FBX SDK Python
我创建了一个可以从Node.js中调用FBX SDK Python的Docker镜像。
由于特定的情况,在Node.js中需要调用FBX SDK Python,因此我创建了一个Docker镜像。
我已经将创建的Docker镜像发布在以下链接上:https://hub.docker.com/r/seguropus/fbx-sdk-python-nodejs
示例程式
我会在下面提供样本代码。
https://github.com/segurvita/docker-fbx-sdk-python-nodejs
如何使用示例代码
# Dockerイメージをビルド
docker-compose build
# Dockerコンテナを起動
docker-compose up
如果以下这样的显示出现,那就表示成功了。
fbx-sdk-python-nodejs | # FBX SDK can read the following formats.
fbx-sdk-python-nodejs | 00 FBX (*.fbx)
fbx-sdk-python-nodejs | 01 AutoCAD DXF (*.dxf)
fbx-sdk-python-nodejs | 02 Alias OBJ (*.obj)
fbx-sdk-python-nodejs | 03 3D Studio 3DS (*.3ds)
fbx-sdk-python-nodejs | 04 Collada DAE (*.dae)
fbx-sdk-python-nodejs | 05 Alembic ABC (*.abc)
fbx-sdk-python-nodejs | 06 Biovision BVH (*.bvh)
fbx-sdk-python-nodejs | 07 Motion Analysis HTR (*.htr)
fbx-sdk-python-nodejs | 08 Motion Analysis TRC (*.trc)
fbx-sdk-python-nodejs | 09 Acclaim ASF (*.asf)
fbx-sdk-python-nodejs | 10 Acclaim AMC (*.amc)
fbx-sdk-python-nodejs | 11 Vicon C3D (*.c3d)
fbx-sdk-python-nodejs | 12 Adaptive Optics AOA (*.aoa)
fbx-sdk-python-nodejs | 13 Superfluo MCD (*.mcd)
fbx-sdk-python-nodejs | 14 (*.zip)
fbx-sdk-python-nodejs exited with code 0
显示的是可以由FBX SDK读取的文件格式列表。
這個顯示表示我們成功地連接到了FBX SDK Python。
发生了什么?
首先,通过执行docker-compose up命令启动Docker容器。
一旦启动,Docker容器将执行Node.js的index.js代码。
index.js 调用了 Python 代码 main.py。
主要的.py文件通过FBX SDK Python从可兼容的格式列表中获取并显示。
Dockerfile 的内容可以被重述如下:
我发现有人发布了一个同时包含Python和Node.js的Docker镜像,所以我以此为基础尝试创建了Dockerfile。
# Python 2.7とNode.js 12が入ったAlpine
FROM nikolaik/python-nodejs:python2.7-nodejs12-alpine
# apkでライブラリ更新
RUN apk update && \
apk add \
curl \
libxml2 \
libstdc++
# FBX SDKをダウンロード
RUN curl -L \
https://damassets.autodesk.net/content/dam/autodesk/www/adn/fbx/20195/fbx20195_fbxpythonsdk_linux.tar.gz \
-o /tmp/fbx20195_fbxpythonsdk_linux.tar.gz
# インストール先フォルダ作成
RUN mkdir -p /python-fbx/install
# FBX SDKを解凍
RUN tar -zxvf \
/tmp/fbx20195_fbxpythonsdk_linux.tar.gz \
-C /python-fbx && \
printf "yes\nn" | \
/python-fbx/fbx20195_fbxpythonsdk_linux \
/python-fbx/install
# FBX SDKをインストール
RUN cp /python-fbx/install/lib/Python27_ucs4_x64/* \
/usr/local/lib/python2.7/site-packages/
# python-shellをインストール
RUN npm install -g python-shell
# 一時ファイルを削除
RUN rm -r /python-fbx
RUN rm /tmp/fbx20195_fbxpythonsdk_linux.tar.gz
# 環境変数NODE_PATHを設定
ENV NODE_PATH /usr/local/lib/node_modules
Python-shell 是一个用于从Node.js调用Python的库。
由于在全局范围内进行了安装,为了确保可以通过 require 获取到 index.js,我们设置了环境变量 NODE_PATH。
docker-compose.yml文件的同义词:DOCKER编排文件。
docker-compose.yml 文件的样子如下。
version: '3'
services:
fbx-sdk-python-nodejs:
image: 'seguropus/fbx-sdk-python-nodejs'
container_name: 'fbx-sdk-python-nodejs'
build:
context: ./
dockerfile: ./Dockerfile
volumes:
- .:/src
working_dir: /src
command: node index.js
在Docker容器启动时,index.js会被执行。
索引.js
index.js的内容如下所示。
const pythonShell = require('python-shell');
// python-shellのオプション
const pyOption = {
mode: 'text',
pythonPath: '/usr/local/bin/python',
pythonOptions: ['-u'],
scriptPath: '/src',
}
// main.pyを実行
const pyShell = new pythonShell.PythonShell('main.py', pyOption);
// Pythonの標準出力を表示
pyShell.on('message', (message) => {
console.log(message);
});
// 終了処理
pyShell.end(function (err, code, signal) {
if (err) {
console.error(err);
}
console.log('The exit code was: ' + code);
});
我正在使用python-shell调用main.py文件。
主要的.py文件
以下是main.py的样子。
from fbx import *
def list_reader_format(manager):
print('# FBX SDK can read the following formats.')
for formatIndex in range(manager.GetIOPluginRegistry().GetReaderFormatCount()):
description = manager.GetIOPluginRegistry().GetReaderFormatDescription(formatIndex)
print(formatIndex, description)
def main():
# Create
manager = FbxManager.Create()
scene = FbxScene.Create(manager, "fbxScene")
# List
list_reader_format(manager)
# Destroy
scene.Destroy()
manager.Destroy()
if __name__ == '__main__':
main()
通过 from fbx import * 导入了 FBX SDK Python。
使用 list_reader_format() 函数,将 FBX SDK Python 可以读取的文件格式列表显示在标准输出中。
我成功地创建了一个能够从Node.js无问题地调用FBX SDK Python的Docker镜像!
尝试将其发布到Docker Hub
既然机会难得,我就试着在Docker Hub上发布一下。
# ログインする
docker login
# Dockerイメージをプッシュする
docker push seguropus/fbx-sdk-python-nodejs
以下的内容已经在以下网址上公开了。
https://hub.docker.com/r/seguropus/fbx-sdk-python-nodejs
最后
在撰写本文时,我参考了以下的页面。非常感谢。
-
- https://hub.docker.com/r/lerignoux/python-fbx
-
- https://hub.docker.com/r/nikolaik/python-nodejs
-
- Node.jsからPythonのコードを呼び出すPython-shellを使ってみた
-
- FBX SDK Pythonが対応しているファイル形式一覧
- Node.js グローバルインストールでハマった