最近のトラックバック

最近のコメント

2017年1月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
無料ブログはココログ

Python

2017年1月17日 (火)

pylintのインストールエラー

VS CodeのMarketPlaceからdonjayamanne.pythonをインストールすると、pyファイルをエディットしているときに"Linter pylint is not installed"というエラーがでる。

donjayamanne.pythonの初期設定でsetting.josonが以下のような設定になっているため。
  // Whether to lint Python files.
  "python.linting.enabled": true,
  // Whether to lint Python files using pylint.
  "python.linting.pylintEnabled": true,


"Install Pylint"をクリックするとVS Code内のターミナル画面でPylintがインストールされる・・はずなんだけど以下のエラーが発生。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\<中略>\VisualStudioCode>python -m pip install pylint
Collecting pylint
  Using cached pylint-1.6.4-py2.py3-none-any.whl
Collecting mccabe (from pylint)
  Downloading mccabe-0.5.3-py2.py3-none-any.whl
Collecting colorama; sys_platform == "win32" (from pylint)
  Using cached colorama-0.3.7-py2.py3-none-any.whl
Collecting isort>=4.2.5 (from pylint)
  Using cached isort-4.2.5-py2.py3-none-any.whl
Collecting astroid<1.5.0,>=1.4.5 (from pylint)
  Downloading astroid-1.4.9-py2.py3-none-any.whl (213kB)
    100% |################################| 215kB 2.2MB/s
Collecting six (from pylint)
  Using cached six-1.10.0-py2.py3-none-any.whl
Collecting wrapt (from astroid<1.5.0,>=1.4.5->pylint)
  Using cached wrapt-1.10.8.tar.gz
    Complete output from command python setup.py egg_info:
    running egg_info
    creating pip-egg-info\wrapt.egg-info
    creating pip-egg-info\wrapt.egg-info
    writing top-level names to pip-egg-info\wrapt.egg-info\top_level.txt
    writing dependency_links to pip-egg-info\wrapt.egg-info\dependency_links.txt
    writing pip-egg-info\wrapt.egg-info\PKG-INFO
    writing manifest file 'pip-egg-info\wrapt.egg-info\SOURCES.txt'
    warning: manifest_maker: standard file '-c' not found
    error: [Errno 2] No such file or directory: '<略>\\python\\python35.zip\\lib2to3\\Grammar.txt'
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\\<中略>\AppData\Local\Temp\pip-build-ygt2fod3\wrapt\

VS Codeからではなくコマンドプロンプトから実行しても同様のエラー。
これは、zip版を展開したPython環境で発生。インストーラー経由でインストールしていると問題ない。

zipを展開したときに、つまり初めてインストールして(言い換えると解凍した)Pythonフォルダを見たときに、python35.zipファイルというのが存在していて、ソースかなんかが入ってるのかなと特に気に留めることもなく放置していたファイルにアクセスしに行ってると。

python35.zipファイルの中身を調べると、lib2to3というフォルダも、Grammer.txtというファイルも存在していた。けど、なんでzipファイルの中身を見るんだろうなぁと不思議に思う。

インストーラー版Python環境を見ると、lib2to3というフォルダとGrammer.txtというファイルはlibフォルダ配下に存在していた。
ということで、もしかしてpython35.zipはlib配下に展開するためのものかと思い、python35.zipとlibフォルダを比較すると、中身が一致。
# 多分、どっかに注意書きが書いてあったんだろうなぁ。


なので、zipファイルを展開して、その中身をlib(zip解凍版のPython環境では手動でフォルダを作成していたので、殆どろくに何もない)配下へ移動。
# この時点ではpython35.zipファイルは消さずに残したまま。展開してできたpython35フォルダは削除


その状態で再び、"python -m pip install pylint"を実行。
けど、同様のエラー。

何故か知らないけど、python35.zipファイルが最初の検索パスに設定されてるっぽいので、python35.zipファイルを丸ごと削除。

lib配下に何もない状態でpip自体をインストールしたからかな?と思い、pipを再インストール。そしてpylintのインストールを三度実行するも、同様のエラー。

なので、python35.zipファイルを削除して(もしくはリネームして)pylintのインストールを再び実行すると今度は正常にインストールされた。

けどなんでpython35.zipファイルを見に行くのかは、pip関連のpyファイルを見てもちょっとよくわからなかったなぁ。

2017年1月 5日 (木)

pipのインストール(続)

get-pip.pyをダウンロードして、scriptsフォルダ配下に配置。

んで、
>python scripts\get-pip.py
と実行したら、一緒にsetuptoolsもインストールしてくれてた。

get-pip.pyのソースを確認すると、 インストールされていなければ"setuptools"と"wheel"も入れてくれるみたい。

pipをインストール後
>python -m pip install --upgrade pip
を実行してアップグレード。

※pip install --upgrade pipでもいいはずなんだけど以下のエントリみて両方実行しました。

windows in-place pip upgrades #1299

pipのインストール

Windows PCにzipファイルを解凍してpython.exeが起動できるまでを確認。
次はNuGetやRubyGemみたいなやつを入れないと、ということで。
初めてあれこれ見てた時(3か月ぐらい前)はさっぱりわけわからなかったけど(Python2とPython3の情報が混在しているので猶更)、その時見てた情報を整理するとこんな感じ。
 
・Setuptools + pipを入れる
最新版のsetuptoolsを入手するにはez_setup.pyをダウンロードして実行する(リンクあり)。
イマイチ英語がよくわからなかったけど、これでeasy_installを入手できると。
けど、easy_installではなくpipを入れた方がいいということらしい。pipはget-pip.py(これはリンク先が切れてた)でインストールする事が出来ると。
 
・ez_setup.pyをダウンロードして実行
setuptoolsとはつまりはeasy_installのことを指すらしい(けどこのページにあるez_setup.pyはリンクが切れてた)。
ダウンロードしたez_setup.pyに対して、python ez_setup.pyを実行するだけっぽい。
これによってeasy_installが使えるようになるそうな。
 
# easy_installを使ってpipをインストール
> easy_install pip
 
→これを見ると、「pipはsetuptoolsの一部であるeasy_installを置き換える」「setuptools置き換えのdistributeというものもあるのですが、こちらはsetuptools全体を置き換えるものとして開発されており」とある。
→手順は、最初にsetuptoolsを入れないといけないらしい。setuptoolsに入っているeasy_installを使ってpipを入れるそうな。
けど、この記事の内容は既に古くなっているとのことで、以下のエントリを参照とのこと。
 
→上記記事を更新したこのエントリでは、
pip 1.5.1からsetuptoolsのインストールが要らなくなりました。get-pip.pyが自動的に入れてくれます。」とのことだそうな。
# リンク先からget-pip.pyをダウンロード(けど、リンク先の中身をみると、最新版はhttps://bootstrap.pypa.io/get-pip.pyに移動したそうな)して、実行。
> python get-pip.py
これでpipがインストールされる
 
→この人の場合は、ez_setup.pyをダウンロードしてpython ez_setup.pyと実行。するとeasy_installがインストールされる。
 
→しかしこの人は、setuptoolsはpython 2用なのでPython 3であればdistributeを使えと言っておる。
手順としては、
・最初distributeをインストール。
・distributeを入れることでeasy_intallが使えるようになるらしい。
・で、このeasy_installを使ってpipを入れるという段取り。
 
しかし
によると、3.3から「Python3.3では、distribute が packaging という名前でバンドルされるようだ。このため更に、手順やコマンドが違ってくる予定。」だそうな
 
→これはPowerShellをつかったインストールのやりかた
        (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
        (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
 
→get-pip.pyはここからダウンロード↓

なんかココログは使いずらいというか、書きずらいなぁ・・・

2016年12月20日 (火)

リスト内包とif

リスト内容表記で、if文を書くときはforの後ろに書くけど、elseを追加するとforの前に書かないといけないというのもヘンだなぁ。

>>> [a for a in range(3)]
[0, 1, 2]

# ifを前に書くとエラー
>>> [a if a > 0 for a in range(3)]
SyntaxError: invalid syntax

# elseを追加するとOK
>>> [a if a > 0 else '' for a in range(3)]
['', 1, 2]

# elifはNG
>>> [a if a > 0 elif a < 0  '' for a in range(3)]
SyntaxError: invalid syntax

# 後ろに書くとOK
>>> [a for a in range(3) if a > 0]
[1, 2]
>>>

二次元配列のコピー(解決というか確認)

>>> id(a)
804835952200
>>> id(b)
804835950728


# 以下のようにやるとOK
>>> import copy
>>> b=copy.deepcopy(b)
>>> b
[[6, 2, 3], [4, 5, 6]]
>>> a
[[6, 2, 3], [4, 5, 6]]
>>> a[0][0]=9
>>> a
[[9, 2, 3], [4, 5, 6]]
>>> b
[[6, 2, 3], [4, 5, 6]]
>>>

2016年12月19日 (月)

二次元配列のコピーで、あれ?

# 言わずもがなの例
>>> a=[1,2,3]
>>> b=a
>>> a[0]=2
>>> b
[2, 2, 3]
>>> b=a[:]
>>> a[0]=4
>>> b
[2, 2, 3]
# だけど、試しに二次元配列にして
>>> a=[[1,2,3],[4,5,6]]
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b=a
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][0]=2
>>> a
[[2, 2, 3], [4, 5, 6]]
>>> b
[[2, 2, 3], [4, 5, 6]]
# これは当然
# んで、
>>> b=a[:]
>>> b
[[2, 2, 3], [4, 5, 6]]
>>> a
[[2, 2, 3], [4, 5, 6]]
>>> a[0][0]=4
>>> a
[[4, 2, 3], [4, 5, 6]]
>>> b
[[4, 2, 3], [4, 5, 6]]
# あれ?
# じゃ、試しに
>>> b=a[:][:]
>>> a[0][0]=6
>>> a
[[6, 2, 3], [4, 5, 6]]
>>> b
[[6, 2, 3], [4, 5, 6]]
# これもだめ

もしかすると
ただし、リストの中身が辞書のような参照先のあるオブジェクトである場合は、上記の方法でリストのコピーができても、中身の辞書は参照先が渡されるためコピーできません。

に該当するのかな。

続きを読む "二次元配列のコピーで、あれ?" »

2016年12月17日 (土)

リスト(シーケンス、文字列)を一文字毎の配列に変換

備忘のためにメモ。

リストを一文字づつの配列に
>>> d="abcd"
>>> list(d)
['a', 'b', 'c', 'd']

以下は残骸。最初はsplitでできないか試した残骸。
>>> d.split()
['abcd']
>>> d.split("")
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    d.split("")
ValueError: empty separator
>>> d.split('')
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    d.split('')
ValueError: empty separator

2016年12月11日 (日)

Pythonインストール

Windowsパソコンにインストールしようとする。

ただしPCの制約から、インストーラーではなくzipファイルから解凍してPythonをインストールすることを選択。

要はUAC画面を表示させたくないし(UACを無効にする気もないし)、管理者権限が必要なインストールはしたくなかったと。

その時点ではWinPythonの存在を知らず、色んなブログで取り上げられてたAnacondaは、別のPCで試しにやったらUAC画面が出てきたので、Python.orgからWindows x86-64 embeddable zip fileをダウンロードして解凍することに。
解凍して、いくつか環境変数(PYTHONPATH/PYTHONHOME)を定義し、パスに追加設定した状態でコマンドプロンプトを開いて、Python.exeを実行すると問題なく動作したのを確認。
通常のインストーラーを利用してインストールしたPCと比較すると、libとかScriptsとかのフォルダが存在しない。
とりあず、libとScriptsフォルダを作成し、環境変数PYTHONPATHとPATHに両方とも追加。まぁ、何もないけど。
解凍したこの状態では、ランチャーのpyもないし、pipも存在しない。

2016年12月10日 (土)

WinPythonのWinPython Powershell Prompt.exeを起動するとエラーがでる

Python.orgからダウンロードしたPythonとは別に、追加でWinPythonをダウンロードしてインストール。

試しにWinPythonに含まれているPowerShell(WinPython Powershell Prompt.exe)を起動してみた。 すると、

"WindowSize" の設定中に例外が発生しました: "ウィンドウの幅は 192 を上回ることができません

というエラーが表示される。
WinPython_PS_Prompt.ps1というスクリプトでエラーが表示されるので中を確認すると、ウィンドウサイズを指定する箇所が問題らしい。
Set-WindowSize 210 40 6000
Set-WindowSize内で
$size = New-Object System.Management.Automation.Host.Size($x,$y)
$host.ui.rawui.WindowSize = $size 
という風に指定している。
なので、210としている箇所を192よりも小さい値に変更。
するとエラーは表示されなくなった。

2016年9月26日 (月)

Python 2とPython 3の非互換

Python 2とPython 3の非互換の最たるものは、ググった時の検索結果だと思う。

文字・文字列を数値に変換するとき、さくっと引っかかるのがint()とlong()を使って変換するやり方。
けど、これはPython 2の書き方。
Python 3になってlongに統一(加えてlongがintにリネーム -- チュートリアルによると)されたので、long()を使うとlongなんて存在しねーというエラーとなってしまう。
また、range()やmap()の戻り値も、Python 2だとリストなんだけど、Python 3だとオブジェクト/Objectが戻り値。
なので、自分の出力結果がネットの記事と違うぞ??と混乱してしまう。
配列の値を文字列から数値に一括変換しようとして
たとえば
>>> a=["1", "2", "3"]
>>> map(int, a)
<map object at 0x000000C2F1D287B8>
>>>
あれ?[1, 2, 3]になるんじゃないの?
Python 3だと
>>> list(map(int, a))
[1, 2, 3]
こう書かないといけないと・・・。