Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

cgi-binでpythonを走らせたときに、temporary cache directory を作ろうとしてエラーが出る【python3, Debian】

エラーメッセージは

Matplotlib created a temporary cache directory at /tmp/matplotlib-nmam8fv7 because there was an issue with the default path (/var/www/.cache/matplotlib); it is highly recommended to set the MPLCONFIGDIR environment variable

みたいな感じ

/var/www/.cache/matplotlib に書き込めないから一時的に別の場所にファイルを作ったよとエラー(ワーニング?)が出る

cgi-binじゃないときはこれで解決できる

qiita.com

ホームディレクトリに書き出す場所を作る

sudo mkdir -p ~/.config/matplotlib
sudo chmod -R 777 /home/【username】/.config/matplotlib

MPLCONFIGDIR という変数を設定する方法

Matplotlib created a temporary config/cache directory

これもやってみたが、特に改善はしなかった・・・

cgi-binから/var/www/.cache/matplotlibを書き込めるようにした

sudo chown -R www-data:www-data /var/www/.cache/

これでワーニングメッセージは出なくなった

ランキング参加中です

↓クリックしていただけると嬉しいです〜

apache2でcgi-binを使えるようにしてみる【Debian12】

参考ページ

www.server-world.info

sudo a2enmod cgid

# 再起動
sudo systemctl restart apache2

cgi-binで走るスクリプトをpythonのみに限定する

上記のサイトでは

/etc/apache2/conf-available/cgi-enabled.conf
にその設定を書き込むように書いてあるが、自分の環境では動かなかった・・・

代替手段としては

sudo emacs /etc/apache2/mods-available/cgid.conf

で下に、
AddHandler cgi-script .py
と追記する

これで行けるなら?
ということで、別の設定ファイルに追記してみた

sudo emacs /etc/apache2/conf-available/serve-cgi-bin.conf
    <IfDefine ENABLE_USR_LIB_CGI_BIN>
     ScriptAlias /cgi-bin/ /var/www/html/hogehoge/cgi-bin/
               <Directory "/var/www/html/hogehoge/cgi-bin/">
                      AllowOverride None
                      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                      AddHandler cgi-script .py
                      Require all granted
               </Directory>
     </IfDefine>

という行を下の方に追記した
hogehogeは自分の環境に合わせて変更してください

公開されるページは、 /var/www/html/hogehoge に下に書かれているhtmlなどなど

SymLinksIfOwnerMatch
は、そのディレクトリに置いてあるシンボリックリンクも遡って公開するか? という設定

ExecCGI
は、cgi-binを使うために必要だと思う

AddHandler cgi-script .py
がpythonの拡張子を持ったスクリプトのみ走るようにする制限

再起動

  • `systemctl reload apache2`

ありがちだった罠

今回はまだハマっていないけど、以前ありがちだった罠をメモしておきます

  • 走らせたいスクリプトの実行権限は755にしておく
  • `chmod 755 hoge.py`
  • 公開するディレクトリの所有者は特にいじらなくても良い
    • ただし cgi-bin の実行結果をどこかのディレクトリに格納したい場合は、そのディレクトリの所有者は、www-data にしておく必要がある
    • `sudo chown -R www-data:www-data ./`
  • 公開するディレクトリがシンボリックリンクの場合は上記の SymLinksIfOwnerMatch を忘れないようにする
  • スクリプトをcgi-bin経由で実行すると、コードがそのまま表示される
    • これは、そのスクリプトが実行できるスクリプトだと見なされていない時に起こるエラー
    • 上記の AddHandler cgi-script .py あたりがうまくいってなさそう

ランキング参加中です

↓クリックしていただけると嬉しいです〜

cgiというパッケージがなくなったので、代わりにlegacy-cgiを使う【python3.13・mamba】

python3.13でcgiを使おうとしたら、パッケージがないと言われた

調べてみたら、python3.13 からcgiはデフォルトのパッケージではなくなったらしい

chaba-lab.com


困った・・・と思って調べてみると、legacy-cgiというパッケージがあるらしい

pypi.org

インストール

mamba install legacy-cgi

google のAIがimportするコマンドはこうだよ?と言ってきたコマンドではエラーが出る

qiita.com

調べてみると

import legacy_cgi
でも
import legacy-cgi
でもなく

import cgi

でOK
(要するに以前のコードは変えなくてもいいっぽい)

他にも

import cgitb

もエラーなく使えました

                • -

結局、python3.12をインストールし直した

どうやら、cgiの実行時のエラーの表示のされ方が以前と少し異なる・・・

エラーが画面にそのままでない
開発→コードを表示
のようにして、やっとエラーがわかるような感じ

不便なので、python3.12をインストールしなおしてどうなるかみてみる

一応、これでうまくいった

python3.12 を使う代償

DeprecationWarning: 'cgi' is deprecated and slated for removal in Python 3.13

というワーニングがやたらと出るがしょうがないね

ランキング参加中です

↓クリックしていただけると嬉しいです〜

新しくターミナルを開いた時にmamba のbaseがactivateされていないとき【mamba・miniforge】

.zshrcの一番最後に、mambaをactivateするためのおまじないは書かれている

が、新しくターミナルを開いた時にmamba のbaseがactivateされていないとき

mamba init

としても、そもそも、そういうオプションがないっぽい

代わりに、

conda init

としても、なぜか .bashrcが更新される

conda init zsh

が正解っぽい
これで
これで ~/.zshrc が更新された

次回ターミナルを開いた時はデフォルトでbaseがactivateされていた

ランキング参加中です

↓クリックしていただけると嬉しいです〜

mambaを使うためにminiforgeをインストールした【Debian12・python3】


参考

zenn.dev

  • anaconda
  • miniconda
  • miniforge

は別物らしい
その区別は上記のリンクを参照

今回は mambaが使いたいので、 miniforgeをインストールする
mambaはc++で書かれてるので? 通常のcondaよりも早い

インストールマニュアル

github.com

# スクリプトを落としてくる
wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"

# スクリプトを走らせる
bash Miniforge3-$(uname)-$(uname -m).sh

この後、いくつか質問が出たり、yesと打つ

最後に、初期設定をやるか聞かれるのでやっておく

Proceed with initialization? [yes|no]
[no] >>> yes

これで .zshrcの最後にインストールされたminiforgeの設定が追記された

以前から使ってるDebianの.zshrcがあるけど、そのときはanacondaだった気がするので微妙にリンクが違う・・・
なので、これはありがたい

インストールはかなりすぐに終わった。

アンインストールの方法

github.com

ここにコマンドラインが載ってる
設定を解除して、rmしていくのでOK

# Use this first command to see what rc files will be updated
conda init --reverse --dry-run
# Use this next command to take action on the rc files listed above
conda init --reverse
# Temporarily IGNORE the shell message
#       'For changes to take effect, close and re-open your current shell.',
# and CLOSE THE SHELL ONLY AFTER the 3rd step below is completed.
CONDA_BASE_ENVIRONMENT=$(conda info --base)
echo The next command will delete all files in ${CONDA_BASE_ENVIRONMENT}
# Warning, the rm command below is irreversible!
# check the output of the echo command above
# To make sure you are deleting the correct directory
rm -rf ${CONDA_BASE_ENVIRONMENT}
rm -f "${HOME}/.condarc"
rm -fr ${HOME}/.conda

ランキング参加中です

↓クリックしていただけると嬉しいです〜

【python3】テキストファイルの中身を一部書き換えたいとき(シェルコマンドのsed相当のことをしたい)

python3からsubprocessからsedを呼んであれこれしてみたけど、うまくいかない・・・

根拠まだないけど、リダイレクトの部分がうまくsubprocessでは機能しないのかもしれない

代わりに、python3でテキストファイルを開いて、中身を置換して書き出すという古典的な方針に変更した

参考

qiita.com

コード例

with open(fname, "r") as f :
  sent = [ row.replace(beforeWord1, afterWord1) for row in f ]
  sent = [ row.replace(beforeWord2, afterWord2) for row in sent ]
   #書き込み    
with open(fname, "w") as f :
  f.writelines(sent)

上記のページから借りてきて少し修正しました
fnameはファイル名
beforeWordをafterWordに置き換える
sentの行が2つあるけど、2回目のは、別のフレーズを置換したいとき用。1つだけでいいなら不要

subprocessでリダイレクトするには少し特殊なことをしないといけない

techblog.asahi-net.co.jp

# python
with open("ls.txt", "ab") as f:
    subprocess.run(["ls", "-l"], stdout=f)

みたいな感じ

ランキング参加中です

↓クリックしていただけると嬉しいです〜