follow us in feedly

Python

Windows7のget-pip.pyで発生したエラーに対処する

前回記事にあるとおり、Windows上でPythonを使うことになりました。
ついでにPythonのパッケージ管理システムであるpipをインストールすることにしたのですが
ちょっとしたエラーが発生してすんなりとはいかなかったので対応方法をご紹介します。

環境

  • Windows 7
  • Python 3.6.3

get-pip.pyがエラーで動かない

ドキュメントに従ってインストールを試みるも下記エラーが発生。

エラー内容


Traceback (most recent call last):
  File "get-pip.py", line 20061, in <module>
    main()
  File "get-pip.py", line 194, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    import pip
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 656, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\__init__.py", line 26, in <module>
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 656, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\utils\__init__.py", line 23, in <module>
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 656, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\locations.py", line 88, in <module>
  File "ntpath.py", line 75, in join
TypeError: expected str, bytes or os.PathLike object, not NoneType

対応方法

C:\python\python36._pthを編集します。
下記のようにコメントをはずして、siteモジュールをインポートするように設定します。
該当設定の直上コメントにも、”Uncomment”と書いてありますね。


python36.zip
.

# Uncomment to run site.main() automatically
import site # ←コメントをはずす

再実行

再度実行します。無事にインストールが完了しました。
プロキシ環境下での実行なのでオプションを付けています。


$ python get-pip.py --proxy="[user:passwd@]proxy.server:port"
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
Collecting setuptools
  Downloading setuptools-36.5.0-py2.py3-none-any.whl (478kB)
Collecting wheel
  Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-9.0.1 setuptools-36.5.0 wheel-0.30.0

まとめ

pipのインストール時に発生したエラーの対応方法をご紹介しました。
「import site」のコメントをはずすことで解消されます。
proxyオプションとあわせて参考なれば幸いです。

参考

pip — pip 9.0.1 documentation
python 3.6 embed cannot get pip · Issue #7 · pypa/get-pip

Windows版Python3でCSVをSQLiteに保存する

前回のWindows版PHPでのCSVパース問題を解決するためPythonを採用しました。
今回は、そのWindows + PythonでCSVを取り込む方法をご紹介します。
詳細な解説はほとんどなく、ほぼソースコードのみです。

環境

  • Windows 7
  • Python 3.6.3

ソースコード

CSVを読み込んでデータベースに保存します。
仕事で作ったものなので改変しています。

# -*- coding: utf-8 -*-

import os
import io
import sys
import csv
import sqlite3

# 標準出力の文字コードをUTF-8にする
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# ディレクトリを移動
os.chdir(r'C:\Users\77dogs\Sample')

# データベースに接続
conn = sqlite3.connect('db\contents.sqlite3')
c = conn.cursor()

# contentsテーブルのカラムを取得
sql = 'SELECT * FROM contents LIMIT 1'
c.execute(sql)
columns = []
for row in c.description:
    columns.append(row[0])

sql = 'INSERT INTO contents (%s) VALUES (%s)' \
        % (','.join(columns), ('?,' * len(columns)).rstrip(','))

# CSVの読み込み & 保存
with open('csv\data.csv', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    next(reader)  # ヘッダ読み捨て

    for row in reader:
        c.execute(sql, tuple(row))  # SQLを実行
        conn.commit()  # commit()は必須

conn.close()

標準出力の文字コードを変更する

MSYS2にprint()で出力したときに文字化けしたのでその対策。
sys.stdoutのデフォルトの文字コードはCP932なのでUTF-8に変更。
ちなみに、上記ソースコードにはprint()はありません。

print(sys.stdout.encoding)  # cp932
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print(sys.stdout.encoding)  # utf-8

raw文字列によってエスケープシーケンスを無効にする

エスケープシーケンス(\n, \t など)として解釈してほしくない場合の対策。
下記の場合は、「\U」があるのでraw文字列でないとエラーになる。

# SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
os.chdir('C:\Users\77dogs\Sample')

# raw文字列(r'文字列')だとエスケープシーケンスを無効化
os.chdir(r'C:\Users\77dogs\Sample')

まとめ

Windows + Python3を使って無事にCSVの取り込むができました。
情報もたくさんあるので、多少のつまづきはあったものの簡単に実装できました。
ファイルパスにバックスラッシュを使う場合はエスケープシーケンスに注意です。
はじめてのPython成果物ですが参考になれば幸いです。

参考

sys.stdout のエンコードを変更する in Python3.0
raw文字列 – 文字列 – Python入門
エスケープシーケンス – 文字列 – Python入門
Pythonでsqlite