VS Codeでvenvがうまく動作しなくなった話

結論 venvをあきらめて、Pipenvを導入すればなぜか解決した。 経緯 Pythonの開発環境にVS Codeを使っていましたが、ある日突然、venvで作った環境が見えなくなりました。 PowerShellからは切り替えができるので、venv自体は正しく動いているようでした。 PythonとVS Codeをクリーンインストールしても状況は変わりませんでした[1]。 Pipenvの使い方 最近はPipenvというものがあるらしいので、それを導入することとしました[2][3]。 pip install pipenv 以下のように環境変数を設定することで、プロジェクトのフォルダ直下に仮想環境を構築してくれます。 PIPENV_VENV_IN_PROJECT=true VS Code上にフォルダを作成し、その直下で仮想環境を作成します。 コマンドはVS Code上のPowerShellで行いました。 例えば以下のようになります。パスやPythonのバージョンはご自身の環境に合わせてください。 *pythonの後に半角スペースがあるのでうっかり詰めないでください。 *venvファイルが作成されるという情報もありますが、私の場合はPipfileのみ作られました。 PS PS C:\Users\User Name\Documents\CODE\Python\Test> pipenv install --python 3.8 VS Code上でF1キーを押して、「reload」を検索して実行します。 これで左下のPythonのバージョンセレクトから環境選択できるはずです。 仮想環境から抜けるときは以下のコマンドを使います。 deactivate 参考文献 [1] sota0726 「VScodeを完全にアンインストールする方法(windows10)「拡張機能のホストが予期せずに終了しました。」を改善するために」閲覧日:2020/09/13 https://www.atmarkit.co.jp/ait/articles/1810/12/news026.html [2] KRiver1 「pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。」閲覧日:2020/09/13 h

Python:super()の謎エラー

こんばんは。最近健康面に不安を感じ、大学近くのジムに通い始めました。
大学に入る前より15キロ太ったので、なんとかそのときの体重に戻したいです。

 さて、最近Pythonにはまっております。
[参考]日本Pythonユーザ会 :http://www.python.jp/Zope
Pythonは非常に開発がやりやすいうえ、WindowsだろうがLinuxだろうが同じコードで動いてくれるのが研究でも趣味でも役に立ちます。
特にお気に入りなのは、対話型シェルを使用して一行ずつプログラムを書ける点です。
これを使えば、使い方の分からないメソッドをその場でテストしたり、自作関数の動作テストも容易に出来ます。
 また豊富な機能を実現するモジュールが数多く存在するのが素晴らしいです。
例としてTkinterというGUI製作用のモジュールが存在します。
[参考]Tkinter 8.4 reference: a GUI for Python :http://infohost.nmt.edu/tcc/help/pubs/tkinter/
PythonをWindowsにインストールしたときに標準でついてくるIDLEは、Tkinterで製作されているようです。
Tkinterの使い方は日本語のサイトはいつかあるようですが、紫藤さんのWebページを参考にさせていただきました。
[参考]紫藤のページ :http://www.shido.info/py/index.html

 今回はそのときに真っ先にハマった内容を備忘録を兼ねて書きます。
参考にしたサンプルの内容としてはWidgetを配置する簡単なものです。
その際の初期化を再現すると以下の様になります。


class Son(Parent):
    def __init__(self):
        Parent.Frame.__init__(self)



直接、親クラスの初期化メソッドを呼んでいました。
しかし、Python(2.x系列)では、


super(クラス名, self).メソッド(…)


と書けば親クラスのメソッドを呼べるのに、なぜそうしないのか気になりました。
そこで、実際にsuperを使用して記述しなおしました。


class Son(Parent):
    def __init__(self):
        super(Son, self).__init__()


これを実行すると、以下のようなエラーが出ました
TypeError: super() argument 1 must be type, not classobj
検索してみると、結構困っている人が多いようですが、なんとか以下のような記述を発見しました。
"the problem is that you are using old-style python classes, which do not support super. The easy way to fix this is to put object at the base of your inheritance tree. "
[参考]Open Source Applications Foundation :http://chandlerproject.org/Projects/UsingSuper
どうもクラスのスタイルが古いらしいです。
最初の例題通りのやり方で回避できるようですが、クラスのスタイルが古いとはどういうことでしょうか。
もう少し調べると、hope-echoesさんのwebページを参考にして答えが出ました。
[参考]大カフェイン :http://d.hatena.ne.jp/hope-echoes/20080409/1207732499
Objectクラスを親にもつクラスは全て新形式のクラスで、持たないものは旧形式のクラスのようです。
type()で調べると

・新形式


>>> type(datetime.datetime)
��type 'type'>


・旧形式


>>> type(Tkinter.Frame)
��type 'classobj'>


となりました。
ここでtypeが'classobj'になるものは旧形式のクラスのようです。
つまりTkinterのFrameは旧形式のクラスなので、super()のサーポート外だったようです。

 これでsuper()でエラーが出る理由と回避方法がわかりました。
Pythonはやりはじめなので、今後もこのようなエラーにハマると思いますが、がんばります。
今回は以上で終わりです。

コメント

このブログの人気の投稿

C++11のためにGCCの最新版をインストールする

分解:Logicool M570

MOCO'Sキッチンのフォントに似せるβ版