Aşağıdaki makale size yardımcı olacaktır:Node.js’den bir Python betiği nasıl çalıştırılır
Başlamak için, her iki dilin de ne olduğunu kısaca tanımlayalım.
Node.js, Google Chrome’un Javascript Motoru üzerinde geliştirilmiş bir sunucu tarafı platformudur. Node.js, veri yoğun gerçek zamanlı web uygulamaları geliştirmeye olanak tanır. JavaScript üzerine yazılmıştır ve Windows, Linux ve Mac OS gibi çeşitli işletim sistemlerinde uygulamaların çalıştırılmasına izin verir.
Python, dinamik web uygulamaları oluşturmak için kullanılan nesne yönelimli bir programlama dilidir. Python’un sözdizimi ve dinamik yazım, onu komut dosyası yazmak için ideal bir programlama dili yapar.
Neden Python betiklerini Node.js’den çalıştırmanız gerekebilir?
- Node js, tek bir iş parçacığı temelinde çalıştığı için ağır çoklu görevleri çalıştıramaz, bu da Node J’lerin CPU’ya bağlı görevleri yürütmesini zorlaştırır. Herhangi bir talep geldiğinde, sistem talebi bir kez tamamlayacak ve sadece diğer talebi kabul edecektir. Bu süreç sistemi yavaşlatır ve büyük bir gecikmeyle sonuçlanır.
- Python, sayısal hesaplamalar, büyük veri çözümleri ve makine öğrenimi kullanan arka uç uygulamaları için çok daha uygundur.
- Python, herhangi bir programlama topluluğunun en büyük ekosistemlerinden birine ve birçok açık kaynaklı kitaplığa sahiptir. Örneğin, bazı yerleşik AI kitaplıkları (nöral ağlar için Pylearn2, Tensorflow ve veri analizi için Scikit-learn).
Child Process modülünü kullanarak Python betiğinizi Node.js’den çağırın
Bu konuda size yardımcı olabilecek birkaç kitaplık bulacaksınız. Bana gelince, yerleşik kullanmayı tercih ederim child_process. bu düğüm:child_process modülü alt süreçleri oluşturma yeteneği sağlar. Bu yetenek öncelikle child_process.spawn() işlevi tarafından sağlanır.
Öncelikle, uygulamamız için sunucu olarak bir server.js dosyası oluşturmamız gerekiyor. x olduğunu varsaydığımız yerde ve y büyük dizilerdir.
const ifade = gerekli(‘ekspres’); const { spawnSync } = gerekli(‘child_process’); const { readFile } = gerekli(‘fs/sözler’); const { appendFile } = gerekli(‘fs/sözler’); const { birleştirme } = gerekli(‘yol’); const uygulama = ekspres(); app.get(“https://www.Wix.com/”, async (req, res, next)=>{ const X = [1,2, 5] // büyük dizi const y = [[1,2], [2,3], [1,2]]// büyük dizi appendFile( join(`scripts/args.json`), JSON.stringify({ X, y }), { kodlama: ‘utf-8’, bayrak: ‘w’, }, ); const pythonProcess = spawnSync’i bekliyor(‘python3’, [
‘/usr/src/app/scripts/python-script.py’,
‘first_function’,
‘/usr/src/app/scripts/args.json’,
‘/usr/src/app/scripts/results.json’
]); const sonuç = pythonProcess.stdout?.toString()?.trim(); const hatası = pythonProcess.stderr?.toString()?.trim(); const durumu = sonuç === ‘Tamam’; if (durum) { const arabellek = waitreadFile(‘/usr/src/app/scripts/results.json’); const sonuçParsed = JSON.parse(buffer?.toString()); res.send(resultParsed.toString()) } else { console.log(hata) res.send(JSON.stringify({ durum: 500, mesaj: ‘Sunucu hatası’ })) } }); //Sunucuyu varsayılan port 8000’de oluşturur ve localhost:8000 const port=8000 üzerinden erişilebilir; app.listen(port, () => console.log(`Sunucu ${port} PORT’unu dinliyor`));
spawnSync‘a iletilen ilk parametre command <string> (bu durumda çalıştırılacak komut python3 – kitaplıklarınızı çalıştırmak için gereken python sürümüdür), ikincisi args <dize[]> (dize bağımsız değişkenlerinin listesi). Üçüncü parametreyi de iletebilirsiniz. seçenekler, daha ayrıntılı bilgi şurada bulunabilir: bağlantı.
İkinci argüman olarak aktardığım listeyi daha ayrıntılı olarak ele almayı öneriyorum:
- ‘/usr/src/app/scripts/python-script.py’ – çalıştırmam gereken betiğin yolu
- “ilk_işlev” – o dosyanın içinde çalıştırmak istediğim fonksiyonun adı
- ‘/usr/src/app/scripts/args.json’ – bu işlevin bağımsız değişkenlerini içeren dosyanın yoludur. Aslında, Node.js’deki JSON.stringify()işlevini kullanarak bu bağımsız değişkenleri doğrudan iletebilirsiniz, ancak benim için bu bağımsız değişkenleri dosyaya yazmak ve ardından Python betiğinden okumak daha iyidir. Bunun nedenlerinden biri, büyük veri dizilerini bağımsız değişken olarak iletmeniz gerekebilir ve bu hatalara neden olur.
- ‘/usr/src/app/scripts/results.json’ – Python betiğimin bittikten sonra sonuçları yazmasını istediğim yoldur, böylece bunu Node.js’den okuyabilirim.
Geçirilen bağımsız değişkenler, Python betiğindeki sys.argvdizisinde bulunabilir. sys.argv listesi, bir python programında komut satırı argümanlarını içeren bir listedir. Bir komut satırı arayüzünden bir python programı çalıştırdığımızda, programa farklı argümanlar iletebiliriz. Program, python dosyasının tüm argümanlarını ve dosya adını sys.argv listesinde saklar. Bu, basit bir örnek komut dosyası yazarak daha ayrıntılı olarak görülebilir:
json’u içe aktar, içe aktar sys def first_function(): json_obj = open(sys.argv[2]) veri = json.load(json_obj) hesaplananSonuçlar = [1,2,4,3] # sadece döndürülecek veri örneğidir, aslında onu X = data olarak hesaplayacaksınız[“X”]
y = veri[“y”]
# X ve y’ye dayalı bazı hesaplamalar yapın ve sonucu hesaplananResults’a koyun # print(make_pipeline) json_object_result = json.dumps(calculatedResults, indent=4) with open(sys.argv)[3]”w”) çıkış dosyası olarak: outfile.write(json_object_result) print(“OK”) if sys.argv[1] == ‘ilk_işlev’: ilk_işlev() sys.stdout.flush()
İki kelimeyle, Node.js komut dosyasında gerekli tüm bağımsız değişkenleri dosyaya yazıyoruz, spawnSync komutunu çalıştırıyoruz. bağımsız değişken listesini iletir ve Python betiği dosyadan iletilen bağımsız değişkenleri okuduktan sonra, tüm hesaplamaları yapar ve tüm sonuçları dosyaya yazar. Anlarda tüm bu sonuçlar dosyadan Node.js’de okunabilir.
Belirli Python kitaplıklarını kullanan Python betiğini çalıştırın
Ana hedeflerden biri, yerleşik AI veya diğer kitaplıkları kullanma becerisine sahip olmaktır. Bağımlılıkları ve kitaplıkları küresel olarak bir sisteme kurmak her zaman iyi bir fikir değildir; örneğin, sürüm çakışmalarına, dağıtım güçlüklerine ve aynı anda bir proje üzerinde çalışan birden çok geliştiriciyle ilgili sorunlara yol açabilir. Bu yüzden en mükemmel yol Docker’ı kullanmaktır. Görüntüyü kendiniz oluşturabilirsiniz, ancak en kolay çözüm mevcut olanı kullanmaktır.
FROM nikolaik/python-nodejs:geliştirme olarak en son WORKDIR /usr/src/app RUN pip install scikit-learn numpy pandas simplejson COPY ./package.json ./yarn.lock ./ RUN yarn RUN yarn install COPY ./ ./ RUN yarn build ENV PORT 4000 EXPOSE $PORT # Üretim modu FROM nikolaik/python-nodejs:en son üretim olarak RUN pip kurulumu scikit-learn numpy pandas simplejson ARG NODE_ENV=üretim ENV NODE_ENV=${NODE_ENV} WORKDIR /usr/src/app COPY – -from=development /usr/src/app ./ ENV PORT 4000 EXPOSE $PORT CMD [“node”, “dist/main”]
Şimdilik scikit-learn, numpy, pandas ve simplejson kitaplıklarını kullanabiliyoruz Oluşturulan docker kapsayıcısında mevcut oldukları için Python betiğinde.
Yukarıdaki adımları izleyerek yeni bir süreç oluşturabilir ve Node.js uygulamanızdan bir Python betiği çalıştırabilirsiniz. Bu, Python kodunu Node.js uygulamanıza entegre etmeniz gerektiğinde veya Python için daha uygun olan belirli görevleri gerçekleştirmeniz gerektiğinde yararlı olabilir. Açıklanan basit uygulama şu adresten indirilebilir: Githubnasıl çalıştırılacağına ilişkin talimatları da burada bulabilirsiniz.
İyi kodlamalar ve iyi günler dilerim!