[Python3] 相対パスのimportで上位ディレクトリを指定できない問題とその対策いろいろ

Pythonで自作モジュールをインポートするときに、相対パスで指定する方法があります。
Pythonをそこそこ覚えてきたら、1枚ファイルにベタ書きなんてやってらんないので、当然いくつかのファイル(モジュール)に割りますよね。
そんなことをしていると、上位ディレクトリにあるモジュールを使いたくなることがめっっっっっっちゃ出てくるので、実行スクリプト内で、

のように書いたんですけど、どうもこの書き方、使えないみたいです……

Pythonでは、モジュールをimportする際にsys.pathに入っているパスのリストを見ているみたいなのですが、どうもこれらのパスから上位ディレクトリに遡るような動きができないみたいです。
じゃあなんでこんな書き方サポートしたんや(´・ω・`)

参考→6. モジュール (module) — Python 3.6.5 ドキュメント
https://docs.python.jp/3/tutorial/modules.html#the-module-search-path

Python実行時に、ファイルが有るディレクトリのパスを自動的にsys.pathに挿入してくれるので、同階層のモジュールは触れるみたいです。
でも上層にあるモジュールを使いたみMAXなので、どうにかして使えるようにしてみた解決策をメモしておきます。

解決策1:sys.pathに直接パスを入れる。

sys.pathの実態はリストなので、スクリプト内でいくらでも触りたい放題です。
そこで、import前にモジュールのあるパスを直接ぶっこみます。

__file__の親ディレクトリをappendしています。parentを2回続けているのは、1回だとファイル名を取り除くだけになってしまい、ファイルのあるディレクトリになってしまうからです。

でも、スクリプト内で直接sys.pathをいじるのはどうなんでしょう?

解決策2:一番上の階層に実行ファイルを持ってくる。

上に遡れないならば、すべてを見渡せる位置に持ってくれば問題ありません。
シンプルな解決策でいい感じですが、これだと一つの階層にたくさんのファイルがあふれることにもなりかねません。それでも良いぐらい小さなプロジェクトなら問題ないですが、それならそもそもモジュール分けする必要もないかも……

解決策3:実行時、PYTHONPATHにパスを挿入する。

多分このやり方が一番いい感じなのではないでしょうか??

リファレンスにも書いてありましたが、実行時にはPYTHONPATHの値もsys.pathに含めてくれるみたいです。
そこで、pythonコマンドを実行する前にPYTHONPATHの値を書き換えれば、スクリプトを汚さずにsys.pathをコントロールできます。

この手の実行環境構成の変更は、VSCodeだと簡単にできますね。
プロジェクト内の.vscode/launch.jsonで、使用中のビルド構成に環境変数を書き加えます。

まとめ

Pythonよくわからん
VSCodeまじ神
https://code.visualstudio.com/

クラフトラボ 001に色々なリフィルを突っ込んでみた

クラフトラボ001

少し前に、彼女さんから誕生日プレゼントでサクラのクラフトラボ001(SAKURA craft_lab 001)を買ってもらっちゃいました。
前々から、文房具屋に行くたびに展示のガラスケースに張り付いてたので、見かねて買ってくれたってことですかね。ありがたし(´∀`*)

のろけ的な話はここまでで早速本題ですが……このペン、軸は当然ながらとってもイイ!のですけど、中のリフィルの書き味が、個人的にイマイチなんですよねぇ。

重さに任せて万年筆っぽい筆記角度、かつ軽い筆圧で書くと、どうにもかすれてしまってよろしくありません。「ボールペンなんだから当たり前だ!」って声も出てきそうですが、そこはせっかくのお高いボールペン、ちょっとはこだわりたいのです!

てなわけで、それらしいリフィルをいろいろ買ってみました。

クラフトラボ 互換性がありそうなリフィル

上から、

  • ぺんてる LRN5(エナージェル用)
  • 三菱鉛筆 UMR-85N(ユニボールシグノRT1用)
  • 三菱鉛筆 UMR-83(ユニボールシグノRT1用)
  • サクラクレパス R-BGP05(ボールサインノック用)
  • ダイソー(メーカーはプラチナ) A-PEN GEL用替芯

です。

ネットを検索して同じことをしている先達の成功例から、それっぽいリフィルをゲルインク中心に選んで買ってきました。

これらを片っ端からクラフトラボにあーでもないこーでもないと突っ込んでみた結果がこちら。↓

ぺんてる LRN5 → ×全然入りません。
三菱鉛筆 UMR-85N → ×入りません。
三菱鉛筆 UMR-83 → ◯入った!(なぜこいつだけ……)
サクラクレパス R-BGP05 → ◯入った
ダイソー A-PEN GEL用替芯 → △入ったけどペン先の出が控えめ。

なぜか、三菱のUMR-85Nは入らないのに、UMR-83は入ってしまいました。同じペン軸に入るんだから、太さも同じでいてよっ!!(´;ω;`)
あとさすがボールサインのリフィル、同じメーカーだけあってしっかり入れてきますね。
そして意外なところでダイソー。コレが入るとは思いませんでした。2本で100円なので、コスパは最高ですね。書き味もそんなに悪くないです。

でもこれだけ調べといて、実際に入れて使っているのはジェットストリームの替芯(SXR-10)なんですよね……アレー??
個人的にはペン先は太ければ太いほど良いので……。ゲルインクでは0.5mmが限界だったし、ジェットストリームの書き味は抜群ですからねぇ。しかたなし。

とりあえず、互換性のあるリフィルを実際に確かめられたので良しとします。

参考サイト

クラフトラボ リフィル交換 ( その他趣味 ) – Apple & Biro & others World – Yahoo!ブログ

サクラクラフトラボ購入レビュー!リフィル互換も確認!【SAKURA craft_lab 001】

リフィルの互換性 – ボールペンManiax

[Python3]タスクスケジューラー経由で動作させると、コンソールが消えない問題をどうにかしたい。

最近、ふと思い立ってPythonを始めました。

といっても近頃流行りの機械学習的なものではなく、Seleniumを使ったブラウザの自動操作をやりたくて覚えたんですけどね(´・ω・`)

さてタイトルの話題。
(自分の環境はWindows10上でAnaconda5.2.0を使って開発しております。その前提でお聞きください。)

作ったコードをタスクスケジューラーを使って動作させると、なぜかコンソールが動作終了後も出っぱなしになってしまいます。
1日になんども動かすので、あまり出っぱなしにはなってほしくない!何とかしたい!……と思って調べていたら、2つほど手段が出てきました。

①pythonw.exeを使う。

pythonにはランタイムが2つあるらしくて、コンソールを出す「python」の他に、コンソールを表示しない「pythonw」なるものがあるみたいですね……
これならはじめからコンソールが出ないので、問題にならないです。
python使いの方なら「何アタリマエのこと言うてんねん!」て感じでしょうが、まじなんも知らんところからのスタートなんでゆるして(´;ω;`)

②システムコールを叩いてコンソールそのものを消す。

言われてみれば「なるほど」なんですけどね。

でもこれだと、同時に起動している他のタスクも消えてしまうかもしれないので、確実に1つしか消えない、というとき以外は微妙です。

 

まーおとなしくpythonwで動かすことにします。

参考サイト

windows – Python Scheduled Task Close taskeng.exe – Stack Overflow
https://stackoverflow.com/questions/28302795/python-scheduled-task-close-taskeng-exe

複数のfilebeatからlogstashへデータを流し込もうとしたらlogstashが死んだ

俺も死んだ(チーン

今頃なのか今更なのか知りませんが、Elasticstackに手を出し始めました。
柔軟性が高いのはいいけど、その柔らかさに殺されそうでまぢつらたんです(´;ω;`)

ちなみに構成は、
CentOS6
elastic 6.x
です。

さて、今回問題のケースでは、ログをfilebeatで取得して、logstashに流し込み、elasticsearchに書き込む構成を取りました。
そして、複数サーバーのログを集約させたいので、各サーバーにfilebeatを設置する、という形にしました。
図(?)にするとこんな感じ?ずれてたらごめんなさい
[FB]―[LS]―[ES]
[FB]/

これで動かしたけれども、elasticsearchのほうにIndexがさっぱり作られません。おかしいと思って/var/log/logstash/logstash-plain.logを見ると、以下のエラーがいっぱい書かれてました。

長すぎ!
まぁ要点は「Error: Cannot assign requested address」だと思います。

この時、2つのfilebeatが設定していたlogstashの宛先ポートはどちらも5044でした。
冷静になって考えたら、1つのポートを奪い合う状態はまずいので、片方のfilebeatのポートを5055に変更してやり直してみたら、普通に動きました!(∩´∀`)∩ワーイ

単純にポートの競合はやめましょうって話でした。よくよく考えると恥ずかしいw

引っ越しするので万年筆で恵方巻きを作る

このたび、9年ほど過ごしていた部屋を引き払い、東大和市の方に引っ越しすることになりました。

今まで、1Kで洗濯機なしのクソセマ物件で過ごしていましたが、これからはドラム式洗濯機で悠々洗い物ができるようになります。すごい!(^o^)

 

そんな引っ越しですが、大変気がかりなことが有ります。そう、万年筆の運搬問題です。

別に1本2本なら、ちょっと胸に挿して持ってけばいいんですけど、そんなもんじゃない量があるので、それなりに困ってます。
今まで散財してきた金の量を数えるみたいで嫌なので、持ってる本数はあまり数えないようにしてきたのですが、ざっと見ただけでも50本オーバーはあります。おぉ・・・かみよ!!
それでも、ガチで溜め込んでいるお歴々に比べたら、まだ全然ひよっこなんですから、ほんと万年筆の世界はおそろしいもんですね。

……こまけえこたあいいのです。とにかく運搬です。

本数やら金の話はともかく、その目の前にある問題の解決が先なのです。

竜の卵を優しく迅速に運ぶがごとく、しっかりした装備(?)が必要なのです!

しかし、うちには専門的な緩衝材なんてものはありません。使えそうなのはタオルぐらい。
仕方ないのでタオルでまきまきしてみました。

万年筆恵方巻き1

上の写真にように、タオルで万年筆を巻いて、少々間隔をおいてまたさらに万年筆を巻く。ということを繰り返します。
そして何本か巻き込んだものがこちら。

万年筆恵方巻き2

このままだと、ダンボールに入れたらたちどころにバラけますので、どうにかしてこの状態を固定します。ゴムとかテープとかを使えばいいと思いますが、自分の場合はラップで巻き巻きしてみました。

万年筆恵方巻き3

なんかラップで巻くと、恵方巻き感が微妙にアップしてる感じがしていいですね!!なんてったって食品用ですからね!
そして大体の万年筆を巻き巻きし終わった結果がこちら。

万年筆恵方巻き4

1ロールにだいたい5~7本ぐらいを詰めました。これで適当に運んでも安心ですわね!

ちなみに、ロールのサイド部分は全く保護されていないので、抜け落ちるのかもしれないと不安でしたが、思いっきり振っても抜けませんでした。多分、ラップできつめに巻いてるから問題にならないのかもしれません。
ですので、万年筆を大事にするあまり、ふんわり巻いたりするとやばいかもしれません。

さて、気がかりな万年筆問題も解決したので、ほかのてきとーな品物の処理でもしてきますかね……。