minicondaにおける「指定されたモジュールが見つかりません」問題

そもそもの問題

タイトル通りminicondaでpythonを管理していると「指定されたモジュールが見つかりません」と時々怒られる。pillowにopensslにlxmlとそれはもう幅広い。しかしある時conda上でscriptを実行すると何事もなく通る事が判明。これは一体どういう事だと色々ポチポチやってたらこんなメッセージが出てきた。

This Python interpreter is in a conda environment, but the environment has
not been activated. Libraries may fail to load.  To activate this environment
please see https://conda.io/activation

Type "help", "copyright", "credits" or "license" for more information.

これはcmdにpythonと入れると出てくるメッセージだがこれで原因が大体判明。シンプルにminiconda内のpython.exeを叩くとライブラリが読み込まれてないのでエラーを返す様子。つまりconda上からいちいち実行する必要があるらしい。しかしいちいちそんな事するのは面倒だろうが。ひょっとしなくてもcondaは使えない馬鹿な子なのかしら。コマンドライン一発で実行出来んもんか。

Conda Prompt本体はなにか

pathをみると「\Scripts\activate.bat」にminicondaのpathを渡していてこれがConda Prompt本体のようだ。ではactivate.batとは何かというと結局「condabin\conda.bat activate」を実行しているだけらしい。ではまず「condabin\conda.bat activate」とやらをcmd上で実行してみる。すると見慣れたcondaっぽい物になった。続いて問題のscriptを実行すると無事通った。

結論

ではあとは「condabin\conda.bat activate」と実行scriptを続けて実行させればいいのだ。しかしさてそれは一体どうするのか。まあ別に難しい事は全くなくて2つを「&&」でつないでcmdに放り込めばいい。つまりこうだ。

"...condabin\conda.bat activate" && "python scriptのpath"

次はこのコマンドを.pyに関連付けたい。しかしこのまま登録してしまうとループに入る。pyの実行コマンドにさらにpyが入ってるからだね。色々試行錯誤の結果

"...condabin\conda.bat activate" && "miniconda下のpython.exe" "%1" %*

でいいようだ。要はライブラリさえ読み込んでしまえばpython.exeを直接叩いてもいいらしい。

今月の読書日記

辺境メシ ヤバそうだから食べてみた

辺境メシ ヤバそうだから食べてみた

すごく科学的: SF映画で最新科学がわかる本

すごく科学的: SF映画で最新科学がわかる本

Tablacus Explorer移行日記

X-Finder愛用者だったが開発終了が宣言されてるのでWindows10移行のついでにTablacusに移行しようと思ったはいいが何が何やらさっぱり分からんので後日のためのメモ。こういうのって全設定を終えると触らないから忘れるんだよね。

起動時に指定フォルダを開きたい

起動時にコマンドを実行できればいいはず。と思ったら「開始時の設定」というそのまんまの名前のアドオンがあった。

Tablacusの実行PATHを環境変数で取得したい

X-Finder」アドオンというそのまんまの名前のアドオンで%X-Finder%等が使える。

フォルダ表示を指定したい

「フォルダの表示設定を覚える」アドオンは文字通りの機能しかなく細かく指定したいときは「フォルダ設定」アドオンを使う。細かい指定の仕方は公式にあるので割愛するが「フォルダの表示設定を覚える」アドオンが有効になっているとこちらが優先される。

右クリックからファイルを指定フォルダに移動する

USBメモリでの使用を前提としてるからなのか単純な事が意外にできない。ビルトインコマンドがないので「X-Finder」アドオンを使ってX-Findeのビルトインコマンドを使うしかない。

フィルタでフォルダ以外という除外設定をしたい

単純に正規表現が使えるようだ。具体的には下記のような感じ。

/.*\.(?!folder)/

フィルタ設定で複数拡張子を指定したい

X-Finderでは「.zip,.rar」という感じで出来たがTablacusでは「*.zip;*.rar」となるようだ。

右クリックメニューが長すぎて邪魔

「クイック メニュー」アドオンでアプリケーションが追加したデフォルト以外の項目は消える。デフォルトの項目は「メニュー項目フィルタ」アドオンで一つづつ消す。

ツリーでサブフォルダの展開が邪魔

「ツリー」アドオンのオプションの「全般」タブで「展開」のチェックを外す。更に一覧を外すと同期されなくなる。

今月の読書日記

僕たちは、宇宙のことぜんぜんわからない この世で一番おもしろい宇宙入門

僕たちは、宇宙のことぜんぜんわからない この世で一番おもしろい宇宙入門

生まれたときからせつない動物図鑑

生まれたときからせつない動物図鑑

江戸時代のロビンソン―七つの漂流譚 (新潮文庫)

江戸時代のロビンソン―七つの漂流譚 (新潮文庫)

subprocess.runの引数について

最近仕方ないのでPythonを覚えた。その中でよくお世話になるのがこのsubprocess Module。よく分からないならrun Methodを使っとけばいいと書いてあるので素直に毎回そうしてる。しかしお世話になる割にはいまいちよく分からない。大量の引数があるがそれぞれ一体何の意味があるのか。なんか困ったことがあるたびに毎回検索してる気がするので仕方ないから頑張って調べることにした。ちなみに以下はすべて3.7.1を基準に書いてある。
とりあえずReferenceにはこう書いてある。

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

しかし「*」と引数にあるがこれなんだと思ってReferenceをよく読んだらよく使う引数を表記しただけらしい。ということは他にもあるから「*」なのだな。さらに読むと引数はPopenコンストラクタのそれとほぼ一緒。だったらPopenでいいのではないかと思うがまあいいだろう。

args

実行したいコマンド。もう言わずもがな。

input

子プロセスの標準入力に渡される。文字列もしくはバイト列で指定する。stdinと何が違うのかよく分からんが柔軟な指定が出来そうではある。

stdin
stdout
stderr

それぞれ標準入力、標準出力、標準エラー。

capture_output

Trueの場合stdoutとstderrがキャプチャされる。実行結果がCompletedProcess.stdoutとCompletedProcess.stderrにバイト列で返される。内部ではstdout=PIPEとstderr=PIPEが渡されるので普通に

stdout = subprocess.PIPE, stderr = subprocess.STDOUT

とやるのと何も変わらない。表記的にシンプルなcapture_outputを使うのがおそらく正しいのだろう。

shell

shell依存のコマンドを実行するときに使う。滅多に使うことはない。

cwd

子プロセスの作業ディレクトリを指定する。動画関連とか大量のtempを吐くような時に使うんだろう。

timeout

もう名前通りの子プロセスの実行タイムアウト。TimeoutExpired例外を投げる。

check

Trueの場合CompletedProcess.returncodeが0以外だとCalledProcessError例外を返す。Falseだと何事もなく処理が進む。

encoding

標準入出力及びエラーを文字列で返す場合の文字コード

errors

標準入出力及びエラーを文字列で返す場合のデコードエラー部分を指定文字列で置換する。

text

universal_newlinesのエイリアス。確かにuniversal_newlinesは分かりにくい。

env

子プロセスの環境変数を指定する。独自の環境変数が必要なプログラムってたまにあるけどああいう奴用だろうか。

universal_newlines

Trueの場合標準入出力及びエラーに文字列が返る。Falseの場合バイト列が返る。互換性保持のために残してある。textを使う事。

Popenコンストラクタと引数はほぼ一緒というのだからついでに見ていくが8割方理解できない。ほとんどがLinux系の話。

subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)
bufsize

見たまんまバッファサイズ。open()に渡される。0はなし。1は行単位だから当然text=Trueで使う。正の整数は全サイズ。負の整数はシステム依存でこれがデフォルト。

executable

置換プログラムを指定する。滅多に必要ないと書いてあるが確かに使いどころが理解できない。なんかWindowsにはあまり関係ないみたい。

preexec_fn

呼び出し可能なオブジェクトを指定すると子プロセスで呼び出されるとあるが何のことやらさっぱり。デッドロックの可能性があるから取り扱いには注意する事とかenvやstart_new_sessionで代替できるか考えろとか書いてあるのであまり深く考える必要はなさげ。Windowsには関係ない。

close_fds

Trueの場合子プロセスが実行される前に標準入出力及びエラー以外のファイル記述子が閉じられる。

restore_signals

Trueの場合すべてのシグナルは子プロセス実行前にSIG_DFLに戻される。シグナルとは要するにプロセス間のイベントの事。理解できなくても問題なさそう。Windowsには関係ない

start_new_session

Trueの場合子プロセスでsetsid()システムコールが実行されるらしい。Windowsには関係ない

pass_fds

親子プロセス間で使うファイル記述子のシーケンスを指定する。これを指定すると自動的にclose_fdsにはTrueが入る。

creationflags

Windowsのみ。CreateProcess()に渡される。以下のflagをサポートしている。

subprocess.CREATE_NEW_CONSOLE pythonのコンソールを流用せず新しいコンソールで実行する。
subprocess.CREATE_NEW_PROCESS_GROUP 新しいプロセスグループを生成する。os.kill()を使うのに必要。CREATE_NEW_CONSOLEが指定されていたら無視される。
subprocess.ABOVE_NORMAL_PRIORITY_CLASS 子プロセスの優先度を「通常以上」にする。
subprocess.BELOW_NORMAL_PRIORITY_CLASS 子プロセスの優先度を「通常以下」にする。
subprocess.HIGH_PRIORITY_CLASS 子プロセスの優先度を「高」にする。
subprocess.IDLE_PRIORITY_CLASS 子プロセスの優先度を「低」にする。
subprocess.NORMAL_PRIORITY_CLASS 子プロセスの優先度を「通常」にする。
subprocess.REALTIME_PRIORITY_CLASS 子プロセスの優先度を「リアルタイム」にする。
subprocess.CREATE_NO_WINDOW コンソールなしで実行する。
subprocess.DETACHED_PROCESS 子プロセスに親プロセスのコンソールへのアクセスを許可しない。CREATE_NEW_CONSOLEとの併用は不可。
subprocess.CREATE_DEFAULT_ERROR_MODE 子プロセスに親プロセスのエラーモードを継承させない。
subprocess.CREATE_BREAKAWAY_FROM_JOB 子プロセスをジョブに関連付けない。つまり親プロセスの終了と子プロセスの終了を連動させない。
startupinfo

STARTUPINFOオブジェクトを指定する。

#STARTUPINFOオブジェクトを作る
si = subprocess.STARTUPINFO()
#dwFlagsを指定する
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
#実行する
 subprocess.run(command, startupinfo=si)

今月の読書日記

法律より怖い「会社の掟」 (講談社現代新書)

法律より怖い「会社の掟」 (講談社現代新書)

世界の未来 ギャンブル化する民主主義、帝国化する資本 (朝日新書)

世界の未来 ギャンブル化する民主主義、帝国化する資本 (朝日新書)

古生物のサイズが実感できる!  リアルサイズ古生物図鑑 古生代編

古生物のサイズが実感できる! リアルサイズ古生物図鑑 古生代編

キラキラネームの大研究 (新潮新書)

キラキラネームの大研究 (新潮新書)

今月の読書日記

メイド・イン・ソビエト: 20世紀ロシアの生活図鑑

メイド・イン・ソビエト: 20世紀ロシアの生活図鑑