質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

4380閲覧

subprocessで環境変数の宣言がうまく行かない

DoubleJ794

総合スコア20

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/18 08:19

Pythonから制御してNEUTRINOを動かしたい

subprocess内で記入した export LD_LIBRARY_PATH=$PWD/bin:$PWD/NSF/bin:$LD_LIBRARY_PATH と言う変数をNEUTRINO側がうまく受け取ってくれません。

subprocessのNEUTRINOを実行する直前に書いたりしましたが、全く受け取ってくれませんでした...

発生している問題・エラーメッセージ

./bin/NEUTRINO: error while loading shared libraries: libcublas.so.10: cannot open shared object file: No such file or directory

該当のソースコード

Python

1step1 = 'export LD_LIBRARY_PATH=$PWD/bin:$PWD/NSF/bin:$LD_LIBRARY_PATH && ./bin/musicXMLtoLabel score/musicxml/{0}{1} score/label/full/{0}.lab score/label/mono/{0}.lab'.format(score_data, ext) 2 3subprocess.run(step1, shell=True)

試したこと

Python

1export = 'export LD_LIBRARY_PATH=$PWD/bin:$PWD/NSF/bin:$LD_LIBRARY_PATH' 2step1 = './bin/musicXMLtoLabel score/musicxml/{0}{1} score/label/full/{0}.lab score/label/mono/{0}.lab'.format(score_data, ext) 3 4subprocess.run(export, shell=True) 5subprocess.run(step1, shell=True)

事前にPythonプログラムを実行するターミナル内で宣言しておけば、動作はしました。

補足情報(FW/ツールのバージョンなど)

Python 3.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/05/18 08:34

ソースコード中で起動しているのは、./bin/musicXMLtoLabel で、エラーメッセージを出しているのは ./bin/NEUTRINOですが、この2つはどういう関係ですか?
DoubleJ794

2021/05/18 08:37

あ、ミスってました… ./bin/NEUTRINO が ./bin/musicXMLtoLabel で作成されたデータを読み込み、作成するといった感じです 楽譜データ → ./bin/musicXMLtoLabel → ./bin/NEUTRINO → ...
DoubleJ794

2021/05/18 08:39

step2(NEUTRINOの呼び出しのところ)にも書いてみましたが、変わりませんでした…
otn

2021/05/18 08:42

質問文にコピペする部分を間違えたということでしょうか? であれば、編集して正しくしてください。
guest

回答4

0

step2(NEUTRINOの呼び出しのところ)にも書いてみましたが、

exportで設定したものは、そのsubprocess.runの中のそれ以降の部分でのみ有効です。
subprocess.runを複数回使うなら、その都度環境変数の設定が必要です。
あるいは、subprocess.runに先立ってos.environを使ってPythonプロセス自体の環境変数を書き換えて置くか。

変わりませんでした…

書き方が間違っていたのでしょう。書き直し後のコードを載せてください。

投稿2021/05/18 08:51

otn

総合スコア86295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DoubleJ794

2021/05/18 08:57

step2 = 'export LD_LIBRARY_PATH=$PWD/bin:$PWD/NSF/bin:$LD_LIBRARY_PATH ./bin/NEUTRINO score/label/full/{0}.lab score/label/timing/{0}.lab ./output/{0}.f0 ./output/{0}.mgc ./output/{0}.bap ./model/{1}/ -n {2} -k {3} -t -m'.format(score_data, singer_data, CPUThreads, StyleShift) と書いてました
otn

2021/05/18 09:09 編集

exportとNEUTRINOの間に、; か && が抜けてますね。それが原因でしょう。 これだとエラーメッセージも違ったはずですが。
DoubleJ794

2021/05/18 09:24

&& でつないでみましたが、変わりませんでした...
otn

2021/05/18 09:37

変わらないというのは、最初と同じエラーメッセージ? shell=True は書いてますか?
DoubleJ794

2021/05/19 11:08

書いてます 最初と同じメッセージです
otn

2021/05/19 11:29

とすると、あとはタイプミス、コピペミスでしょうか。 間違いが見つかるまで探しましょう。
DoubleJ794

2021/05/19 12:23 編集

ソフトの実行までは行けているのですが、ずっとソフト側が「環境変数が見つからないぞぉ〜」って言っている状態です... コードからコピペ import subprocess as cmd step2 = 'export LD_LIBRARY_PATH=$PWD/bin:$PWD/NSF/bin:$LD_LIBRARY_PATH && ./bin/NEUTRINO score/label/full/{0}.lab score/label/timing/{0}.lab ./output/{0}.f0 ./output/{0}.mgc ./output/{0}.bap ./model/{1}/ -n {2} -k {3} -t -m'.format(score_data, singer_data, CPUThreads, StyleShift) cmd.run(step2, shell=True) ※Pythonのコードは関数内に格納しており、ボタンクリック時に実行 もとのシェルスクリプト ※BASENAME=score_data ※ModelDir=singer_data ※NumThreads=CPUThreads ※StyleShift=StyleShift export LD_LIBRARY_PATH=$PWD/bin:$PWD/NSF/bin:$LD_LIBRARY_PATH ./bin/NEUTRINO score/label/full/${BASENAME}.lab score/label/timing/${BASENAME}.lab ./output/${BASENAME}.f0 ./output/${BASENAME}.mgc ./output/${BASENAME}.bap ./model/${ModelDir}/ -n ${NumThreads} -k ${StyleShift} -t -m
guest

0

ベストアンサー

まず、Pythonで環境変数を設定してからsubprocess.runを実行しましょう。

環境変数の設定は以下です。

python

1import os 2if 'LD_LIBRARY_PATH' in os.environ: 3 os.environ['LD_LIBRARY_PATH'] = './bin:.//NSF/bin:' + os.environ['LD_LIBRARY_PATH'] 4else: 5 os.environ['LD_LIBRARY_PATH'] = './bin:.//NSF/bin' 6

投稿2021/05/18 08:43

ppaul

総合スコア24672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DoubleJ794

2021/05/19 11:10 編集

無事動作しました!! ありがとうございます!! かと思ったら動かなくなっちゃいました... まぁ、地道に自分のコードのあら捜ししていきます...
guest

0

subprocess.runにはenvという環境変数を渡すための引数が用意されているので、
見通し的にはこう書くのもありかなと思いました。
※環境変数が渡ることだけ確認済み

https://docs.python.org/ja/3/library/subprocess.html#module-subprocess

python

1import os 2import subprocess 3 4step1 = './bin/musicXMLtoLabel score/musicxml/{0}{1} score/label/full/{0}.lab score/label/mono/{0}.lab'.format(score_data, ext) 5# 環境変数を引き継ぎつつ、必要な分を構築する 6env = { 7 **os.environ, 8 # 環境変数をあらかじめ展開する必要がある(PWDや元のLD_LIBRARY_PATH) 9 "LD_LIBRARY_PATH": "{0}/bin:{0}/NSF/bin:{1}".format(os.getcwd(), os.environ.get("LD_LIBRARY_PATH", "")), 10} 11subprocess.run(step1, shell=True, env=env)

投稿2021/05/18 08:41

編集2021/05/20 14:53
attakei

総合スコア2740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DoubleJ794

2021/05/18 09:28

Expected expression というエラーがコーディング中に出てきます...
DoubleJ794

2021/05/19 11:15

.formatのあとにカッコを追加すればエラーは消えました... でも動きません...
attakei

2021/05/20 14:54

最初のコメントでフィードバックを貰った際と同様に「どう動かなかったか」が無いと返答がちょっと難しいです。 あり得るケースとしては、環境変数としてLD_LIBRARY_PATHが定義されていないとかなら最初の回答だとKeyErrorが出ます。 ※文法エラー含めて直してみます
guest

0

python

1step1 = 'LD_LIBRARY_PATH=$PWD/bin:$PWD/NSF/bin:$LD_LIBRARY_PATH ./bin/musicXMLtoLabel score/musicxml/{0}{1} score/label/full/{0}.lab score/label/mono/{0}.lab'.format(score_data, ext)

ではダメでしょうか?

投稿2021/05/18 08:26

mather

総合スコア6762

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DoubleJ794

2021/05/18 08:33

動かないです...
mather

2021/05/18 08:37

どう動きませんでしたか?
DoubleJ794

2021/05/18 08:45

全く同じエラーが出ていました… subprocess内で宣言した変数が次のsubprocessでの実行で利用されていない感じです…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問