我创建了一个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 グローバルインストールでハマった
广告
将在 10 秒后关闭
bannerAds