04-13-2023 11:44 PM
Hello,
As the title suggests, the latest version of AI-Studio does not start under Linux.
It complains about a missing libtensorflow.so file
The previous Version 1.7.1 works.
Any help would be appreciated.
error [23:28:54] (electron): node:electron/js2c/asar_bundle:5
/*! no static exports found */function(t,e,r){"use strict";(function(t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.wrapFsWithAsar=void 0;const s=r(/*! buffer */"buffer"),i=r(/*! path */"path"),a=r(/*! util */"util"),o=t._linkedBinding("electron_common_asar"),c=r(/*! module */"module"),f=n.Promise,l=t.env.ELECTRON_NO_ASAR&&"browser"!==t.type&&"renderer"!==t.type,u=t.internalBinding;delete t.internalBinding;const nextTick=(e,r=[])=>{t.nextTick(()=>e(...r))},p=new Map,getOrCreateArchive=t=>{if(p.has(t))return p.get(t);try{const e=new o.Archive(t);return p.set(t,e),e}catch{return null}},h=/\.asar/i,splitPath=e=>{if(t.noAsar||l)return{isAsar:!1};let r=e;return s.Buffer.isBuffer(e)&&(r=e.toString()),"string"!=typeof r?{isAsar:!1}:h.test(r)?o.splitPath(i.normalize(r)):{isAsar:!1}};let _=0;const d=null!=t.getuid?t.getuid():0,y=null!=t.getgid?t.getgid():0,P=new Date,asarStatsToFsStats=function(t){const{Stats:e,constants:n}=r(/*! fs */"fs");let s=n.S_IROTH^n.S_IRGRP^n.S_IRUSR^n.S_IWUSR;return t.isFile?s^=n.S_IFREG:t.isDirectory?s^=n.S_IFDIR:t.isLink&&(s^=n.S_IFLNK),new e(1,s,1,d,y,0,void 0,++_,t.size,void 0,P.getTime(),P.getTime(),P.getTime(),P.getTime())},createError=(t,{asarPath:e,filePath:r}={})=>{let n;switch(t){case"NOT_FOUND":n=new Error(`ENOENT, ${r} not found in ${e}`),n.code="ENOENT",n.errno=-2;break;case"NOT_DIR":n=new Error("ENOTDIR, not a directory"),n.code="ENOTDIR",n.errno=-20;break;case"NO_ACCESS":n=new Error(`EACCES: permission denied, access '${r}'`),n.code="EACCES",n.errno=-13;break;case"INVALID_ARCHIVE":n=new Error(`Invalid package ${e}`);break;default:throw new Error(`Invalid error type "${t}" passed to createError.`)}return n},overrideAPISync=function(t,e,r,n=!1){null==r&&(r=0);const s=t[e],func=function(...t){const e=t[r],n=splitPath(e);if(!n.isAsar)return s.apply(this,t);const{asarPath:i,filePath:a}=n,o=getOrCreateArchive(i);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:i});const c=o.copyFileOut(a);if(!c)throw createError("NOT_FOUND",{asarPath:i,filePath:a});return t[r]=c,s.apply(this,t)};if(n)return func;t[e]=func},overrideAPI=function(t,e,r){null==r&&(r=0);const n=t[e];t[e]=function(...s){const i=s[r],a=splitPath(i);if(!a.isAsar)return n.apply(this,s);const{asarPath:o,filePath:c}=a,f=s[s.length-1];if("function"!=typeof f)return overrideAPISync(t,e,r,!0).apply(this,s);const l=getOrCreateArchive(o);if(!l){const t=createError("INVALID_ARCHIVE",{asarPath:o});return void nextTick(f,[t])}const u=l.copyFileOut(c);if(u)return s[r]=u,n.apply(this,s);{const t=createError("NOT_FOUND",{asarPath:o,filePath:c});nextTick(f,[t])}},n[a.promisify.custom]&&(t[e][a.promisify.custom]=makePromiseFunction(n[a.promisify.custom],r)),t.promises&&t.promises[e]&&(t.promises[e]=makePromiseFunction(t.promises[e],r))};let A;function validateBufferIntegrity(e,n){if(!n)return;A=A||r(/*! crypto */"crypto");const s=A.createHash(n.algorithm).update(e).digest("hex");s!==n.hash&&(console.error(`ASAR Integrity Violation: got a hash mismatch (${s} vs ${n.hash})`),t.exit(1))}const makePromiseFunction=function(t,e){return function(...r){const n=r[e],s=splitPath(n);if(!s.isAsar)return t.apply(this,r);const{asarPath:i,filePath:a}=s,o=getOrCreateArchive(i);if(!o)return f.reject(createError("INVALID_ARCHIVE",{asarPath:i}));const c=o.copyFileOut(a);return c?(r[e]=c,t.apply(this,r)):f.reject(createError("NOT_FOUND",{asarPath:i,filePath:a}))}};e.wrapFsWithAsar=e=>{const n=new Map,logASARAccess=(s,i,a)=>{if(t.env.ELECTRON_LOG_ASAR_READS){if(!n.has(s)){const t=r(/*! path */"path"),i=`${t.basename(s,".asar")}-access-log.txt`,a=t.join(r(/*! os */"os").tmpdir(),i);n.set(s,e.openSync(a,"a"))}e.writeSync(n.get(s),`${a}: ${i}\n`)}},{lstatSync:o}=e;e.lstatSync=(t,e)=>{const r=splitPath(t);if(!r.isAsar)return o(t,e);const{asarPath:n,filePath:s}=r,i=getOrCreateArchive(n);if(!i)throw createError("INVALID_ARCHIVE",{asarPath:n});const a=i.stat(s);if(!a)throw createError("NOT_FOUND",{asarPath:n,filePath:s});return asarStatsToFsStats(a)};const{lstat:l}=e;e.lstat=function(t,e,r){const n=splitPath(t);if("function"==typeof e&&(r=e,e={}),!n.isAsar)return l(t,e,r);const{asarPath:s,filePath:i}=n,a=getOrCreateArchive(s);if(!a){const t=createError("INVALID_ARCHIVE",{asarPath:s});return void nextTick(r,[t])}const o=a.stat(i);if(!o){const t=createError("NOT_FOUND",{asarPath:s,filePath:i});return void nextTick(r,[t])}const c=asarStatsToFsStats(o);nextTick(r,[null,c])},e.promises.lstat=a.promisify(e.lstat);const{statSync:p}=e;e.statSync=(t,r)=>{const{isAsar:n}=splitPath(t);return n?e.lstatSync(t,r):p(t,r)};const{stat:h}=e;e.stat=(r,n,s)=>{const{isAsar:i}=splitPath(r);if("function"==typeof n&&(s=n,n={}),!i)return h(r,n,s);t.nextTick(()=>e.lstat(r,n,s))},e.promises.stat=a.promisify(e.stat);const wrapRealpathSync=function(t){return function(e,r){const n=splitPath(e);if(!n.isAsar)return t.apply(this,arguments);const{asarPath:s,filePath:a}=n,o=getOrCreateArchive(s);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:s});const c=o.realpath(a);if(!1===c)throw createError("NOT_FOUND",{asarPath:s,filePath:a});return i.join(t(s,r),c)}},{realpathSync:_}=e;e.realpathSync=wrapRealpathSync(_),e.realpathSync.native=wrapRealpathSync(_.native);const wrapRealpath=function(t){return function(e,r,n){const s=splitPath(e);if(!s.isAsar)return t.apply(this,arguments);const{asarPath:a,filePath:o}=s;arguments.length<3&&(n=r,r={});const c=getOrCreateArchive(a);if(!c){const t=createError("INVALID_ARCHIVE",{asarPath:a});return void nextTick(n,[t])}const f=c.realpath(o);if(!1!==f)t(a,r,(t,e)=>{if(null===t){const t=i.join(e,f);n(null,t)}else n(t)});else{const t=createError("NOT_FOUND",{asarPath:a,filePath:o});nextTick(n,[t])}}},{realpath:d}=e;e.realpath=wrapRealpath(d),e.realpath.native=wrapRealpath(d.native),e.promises.realpath=a.promisify(e.realpath.native);const{exists:y}=e;e.exists=(t,e)=>{const r=splitPath(t);if(!r.isAsar)return y(t,e);const{asarPath:n,filePath:s}=r,i=getOrCreateArchive(n);if(!i){const t=createError("INVALID_ARCHIVE",{asarPath:n});return void nextTick(e,[t])}const a=!1!==i.stat(s);nextTick(e,[a])},e.exists[a.promisify.custom]=t=>{const e=splitPath(t);if(!e.isAsar)return y[a.promisify.custom](t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);if(!s){const t=createError("INVALID_ARCHIVE",{asarPath:r});return f.reject(t)}return f.resolve(!1!==s.stat(n))};const{existsSync:P}=e;e.existsSync=t=>{const e=splitPath(t);if(!e.isAsar)return P(t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);return!!s&&!1!==s.stat(n)};const{access:A}=e;e.access=function(t,r,n){const s=splitPath(t);if(!s.isAsar)return A.apply(this,arguments);const{asarPath:i,filePath:a}=s;"function"==typeof r&&(n=r,r=e.constants.F_OK);const o=getOrCreateArchive(i);if(!o){const t=createError("INVALID_ARCHIVE",{asarPath:i});return void nextTick(n,[t])}const c=o.getFileInfo(a);if(!c){const t=createError("NOT_FOUND",{asarPath:i,filePath:a});return void nextTick(n,[t])}if(c.unpacked){const t=o.copyFileOut(a);return e.access(t,r,n)}const f=o.stat(a);if(f)if(r&e.constants.W_OK){const t=createError("NO_ACCESS",{asarPath:i,filePath:a});nextTick(n,[t])}else nextTick(n);else{const t=createError("NOT_FOUND",{asarPath:i,filePath:a});nextTick(n,[t])}},e.promises.access=a.promisify(e.access);const{accessSync:I}=e;function fsReadFileAsar(t,r,n){const i=splitPath(t);if(i.isAsar){const{asarPath:t,filePath:a}=i;if("function"==typeof r)n=r,r={encoding:null};else if("string"==typeof r)r={encoding:r};else if(null==r)r={encoding:null};else if("object"!=typeof r)throw new TypeError("Bad arguments");const{encoding:o}=r,c=getOrCreateArchive(t);if(!c){const e=createError("INVALID_ARCHIVE",{asarPath:t});return void nextTick(n,[e])}const f=c.getFileInfo(a);if(!f){const e=createError("NOT_FOUND",{asarPath:t,filePath:a});return void nextTick(n,[e])}if(0===f.size)return void nextTick(n,[null,o?"":s.Buffer.alloc(0)]);if(f.unpacked){const t=c.copyFileOut(a);return e.readFile(t,r,n)}const l=s.Buffer.alloc(f.size),u=c.getFdAndValidateIntegrityLater();if(!(u>=0)){const e=createError("NOT_FOUND",{asarPath:t,filePath:a});return void nextTick(n,[e])}logASARAccess(t,a,f.offset),e.read(u,l,0,f.size,f.offset,t=>{validateBufferIntegrity(l,f.integrity),n(t,o?l.toString(o):l)})}}e.accessSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return I.apply(this,arguments);const{asarPath:s,filePath:i}=n;null==r&&(r=e.constants.F_OK);const a=getOrCreateArchive(s);if(!a)throw createError("INVALID_ARCHIVE",{asarPath:s});const o=a.getFileInfo(i);if(!o)throw createError("NOT_FOUND",{asarPath:s,filePath:i});if(o.unpacked){const t=a.copyFileOut(i);return e.accessSync(t,r)}const c=a.stat(i);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:i});if(r&e.constants.W_OK)throw createError("NO_ACCESS",{asarPath:s,filePath:i})};const{readFile:N}=e;e.readFile=function(t,e,r){const n=splitPath(t);return n.isAsar?fsReadFileAsar(t,e,r):N.apply(this,arguments)};const{readFile:O}=e.promises;e.promises.readFile=function(t,e){const r=splitPath(t);if(!r.isAsar)return O.apply(this,arguments);const n=a.promisify(fsReadFileAsar);return n(t,e)};const{readFileSync:g}=e;e.readFileSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return g.apply(this,arguments);const{asarPath:i,filePath:a}=n,o=getOrCreateArchive(i);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:i});const c=o.getFileInfo(a);if(!c)throw createError("NOT_FOUND",{asarPath:i,filePath:a});if(0===c.size)return r?"":s.Buffer.alloc(0);if(c.unpacked){const t=o.copyFileOut(a);return e.readFileSync(t,r)}if(r){if("string"==typeof r)r={encoding:r};else if("object"!=typeof r)throw new TypeError("Bad arguments")}else r={encoding:null};const{encoding:f}=r,l=s.Buffer.alloc(c.size),u=o.getFdAndValidateIntegrityLater();if(!(u>=0))throw createError("NOT_FOUND",{asarPath:i,filePath:a});return logASARAccess(i,a,c.offset),e.readSync(u,l,0,c.size,c.offset),validateBufferIntegrity(l,c.integrity),f?l.toString(f):l};const{readdir:w}=e;e.readdir=function(t,r={},n){const s=splitPath(t);if("function"==typeof r&&(n=r,r={}),!s.isAsar)return w.apply(this,arguments);const{asarPath:a,filePath:o}=s,c=getOrCreateArchive(a);if(!c){const t=createError("INVALID_ARCHIVE",{asarPath:a});return void nextTick(n,[t])}const f=c.readdir(o);if(f)if(r.withFileTypes){const t=[];for(const r of f){const s=i.join(o,r),f=c.stat(s);if(!f){const t=createError("NOT_FOUND",{asarPath:a,filePath:s});return void nextTick(n,[t])}f.isFile?t.push(new e.Dirent(r,e.constants.UV_DIRENT_FILE)):f.isDirectory?t.push(new e.Dirent(r,e.constants.UV_DIRENT_DIR)):f.isLink&&t.push(new e.Dirent(r,e.constants.UV_DIRENT_LINK))}nextTick(n,[null,t])}else nextTick(n,[null,f]);else{const t=createError("NOT_FOUND",{asarPath:a,filePath:o});nextTick(n,[t])}},e.promises.readdir=a.promisify(e.readdir);const{readdirSync:m}=e;e.readdirSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return m.apply(this,arguments);const{asarPath:s,filePath:a}=n,o=getOrCreateArchive(s);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:s});const c=o.readdir(a);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:a});if(r&&r.withFileTypes){const t=[];for(const r of c){const n=i.join(a,r),c=o.stat(n);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:n});c.isFile?t.push(new e.Dirent(r,e.constants.UV_DIRENT_FILE)):c.isDirectory?t.push(new e.Dirent(r,e.constants.UV_DIRENT_DIR)):c.isLink&&t.push(new e.Dirent(r,e.constants.UV_DIRENT_LINK))}return t}return c};const{internalModuleReadJSON:F}=u("fs");u("fs").internalModuleReadJSON=t=>{const r=splitPath(t);if(!r.isAsar)return F(t);const{asarPath:n,filePath:i}=r,a=getOrCreateArchive(n);if(!a)return[];const o=a.getFileInfo(i);if(!o)return[];if(0===o.size)return["",!1];if(o.unpacked){const t=a.copyFileOut(i),r=e.readFileSync(t,{encoding:"utf8"});return[r,r.length>0]}const c=s.Buffer.alloc(o.size),f=a.getFdAndValidateIntegrityLater();if(!(f>=0))return[];logASARAccess(n,i,o.offset),e.readSync(f,c,0,o.size,o.offset),validateBufferIntegrity(c,o.integrity);const l=c.toString("utf8");return[l,l.length>0]};const{internalModuleStat:S}=u("fs");if(u("fs").internalModuleStat=t=>{const e=splitPath(t);if(!e.isAsar)return S(t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);if(!s)return-34;const i=s.stat(n);return i?i.isDirectory?1:0:-34},"win32"===t.platform){const{mkdir:t}=e;e.mkdir=(e,r,n)=>{"function"==typeof r&&(n=r,r={});const s=splitPath(e);if(s.isAsar&&s.filePath.length>0){const t=createError("NOT_DIR");nextTick(n,[t])}else t(e,r,n)},e.promises.mkdir=a.promisify(e.mkdir);const{mkdirSync:r}=e;e.mkdirSync=function(t,e){const n=splitPath(t);if(n.isAsar&&n.filePath.length)throw createError("NOT_DIR");return r(t,e)}}function invokeWithNoAsar(e){return function(){const r=t.noAsar;t.noAsar=!0;try{return e.apply(this,arguments)}finally{t.noAsar=r}}}overrideAPI(e,"copyFile"),overrideAPISync(e,"copyFileSync"),overrideAPI(e,"open"),overrideAPISync(t,"dlopen",1),overrideAPISync(c._extensions,".node",1),overrideAPISync(e,"openSync");const overrideChildProcess=t=>{const{exec:e,execSync:r}=t;t.exec=invokeWithNoAsar(e),t.exec[a.promisify.custom]=invokeWithNoAsar(e[a.promisify.custom]),t.execSync=invokeWithNoAsar(r),overrideAPI(t,"execFile"),overrideAPISync(t,"execFileSync")},D=new WeakSet;if(t.env.ELECTRON_EAGER_ASAR_HOOK_FOR_TESTING)overrideChildProcess(r(/*! child_process */"child_process"));else{const t=c._load;c._load=(e,...r)=>{const n=t(e,...r);if("child_process"===e&&!D.has(n)){D.add(n),overrideChildProcess(n)}return n}}}}).call(this,r(/*! /internal/common/webpack-provider */"./lib/common/webpack-provider.ts").process,r(/*! /internal/common/webpack-provider */"./lib/common/webpack-provider.ts")._global)},"./lib/asar/init.ts":
Error: libtensorflow.so.2: cannot open shared object file: No such file or directory
at process.func [as dlopen] (node:electron/js2c/asar_bundle:5:1812)
at Module._extensions..node (node:internal/modules/cjs/loader:1203:18)
at Object.func [as .node] (node:electron/js2c/asar_bundle:5:2039)
at Module.load (node:internal/modules/cjs/loader:988:32)
at Module._load (node:internal/modules/cjs/loader:829:12)
at c._load (node:electron/js2c/asar_bundle:5:13343)
at Module.require (node:internal/modules/cjs/loader:1012:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (/tmp/.mount_BME AILTUkca/resources/app.asar/node_modules/@tensorflow/tfjs-node/dist/index.js:60:16)
at Module._compile (node:internal/modules/cjs/loader:1118:14) {
code: 'ERR_DLOPEN_FAILED'
}
info [23:28:54] (electron): Exit forked server process (1, null)
04-15-2023 07:29 AM
Hi dmalcorps,
You can install tensorflow library under Linux.
04-16-2023 03:11 PM
Well yes, that works (there are other bugs, but i can work with that), but that should not be necessary. AI-Studio is packaged as an appimage, it should be selfcontained and bring all its needed dependencies with it. That worked for the previous version and the current windows version. Neither of them need an additional installation step. The documentation does not mention any need to install third party libraries.
The missing tensorflow library is a packaging bug, plain and simple. Is there a bugtracker i could actually report this to?
05-05-2023 10:38 AM
Hi dmalcorps,
The new BME AI-Studio software version uses a third-party library tensorflow, the third-party library is not part of the BME AI-Studio software, so the release package does not contain tensorflow, and needs to be installed manually.