IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python Poetry1.2の新機能

どうも、nippa です。

Poetry1.2 で追加された新機能をまとめておきます。

グループ機能と環境同期はお世話になりそうな機能です。

すべての機能は試せていないので、公式をご確認ください。

Poetry 1.2 公式リリースノート

環境

グループ機能

グループのフォーマット

これまでは、main と dev の 2 つでしたが、1.2 からは gruop 機能が追加されました。

これまでの dev はpyproject.tomlで以下のように記載されていましたが、

[tool.poetry.dev-dependencies]
flake8 = "^5.0.4"

1.2 からはグループの1つとして、記載されるようになりますので、修正が必要になります。

[tool.poetry.group.dev.dependencies]
flake8 = "^5.0.4"

グループ機能が追加されたことにより、同じソースから複数の docker image を作成する場合や、API を分けて実装する際など活用の幅が広がります。

グループを指定してパッケージの追加

以下のように--group [グループ名]を指定してパッケージを追加することができます。

poetry add [パッケージ名] --group [グループ名]

これまでのpoetry add -Dは 1.2 から使えなくなります。

グループ依存をしてたパッケージのインストール

グループ依存をオプションで指定してパッケージのインストールができるようになりました。

# mainと指定したグループをインストール
poetry install --with [グループ名]

# 指定したグループを除外してインストール
poetry install --without [グループ名]

# 指定したグループのみをインストール
poetry install --only [グループ名]

グループのパッケージの削除

以下のコマンドは、指定したグループから指定のパッケージを削除します。

poetry remove [パッケージ名] --group [グループ名]

poetry から requirements.txt のエクスポート

これまでは requirements.txt を poetry から作成するには plugin をインストールする必要がありましたが、1.2 からデフォルトでプラグインがインストールされるようになります。

export の使い方としては以下のようになります。

poetry -o [ファイル名] -f requirements.txt --without-hashes

poetry-plugin-export のダウンロードページ

git レポジトリに対して、サブディレクトリを指定してインストール

git レポジトリを poetry を使ってインストールする際に、サブディレクトリを指定することが可能になります。

#subdirectory=[サブディレクトリ]を以下のように指定することで、指定のディレクトリにインストールすることが可能です。

$ poetry add git+https://github.com/myorg/mypackage_with_subdirs.git#subdirectory=subdir

シングルページの登録

シングルページをソースとして登録することが可能になりました。

poetry source add <SOURCE_NAME> <PAGE_URL>

# e.g.
poetry source add jax https://storage.googleapis.com/jax-releases/jax_releases.html

個人的にはこの機能の利用方法は今のところ思いついていません。。。

poetry.lock ファイルで Poetry の環境を動悸する

複数プロジェクトで poetry を利用しているとパッケージを追加し忘れていても環境に残っている場合がありました。

そのようなときにpoetry.lockの内容を環境に同期させることができるようになりました。

--syncオプションを付けてインストールすると、同期されます。

poetry install --sync

この機能は地味ですが、結構使う頻度が多くなると思います。

感想

ざっくりとではありますが、Poetry1.2 の新機能についてまとめてみました。

いろいろ使いやすくなってきたので、python のパッケージ管理は poetry でと思っています。

ではでは、また次回。

Python Poetry完全アインストール

どうも、nippa です。

Poetry の機能をいろいろ試していたら、Poetry の環境がおかしくなったので、完全にアインストールして、再インストールしました。

トラブルの原意はキャッシュされていたファイルと設定の差分が原因だったのですが、時間が溶けたので記事にしておこうと思います。

環境

Poetry のアインストール

公式のページにも記載されていますが、インストーラーで--uninstallオプションをつけて本体はアインストールすることが可能です。

# --uninstall オプションをつけてアインストール
curl -sSL https://install.python-poetry.org | python3 - --uninstall

# もしくは環境変数を指定してアインストール
curl -sSL https://install.python-poetry.org | POETRY_UNINSTALL=1 python3 -

get-poetry.pyでのインストールしている場合は、

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3 - --uninstall

不要ファイルの削除

macOS でデフォルトインストールした場合、以下のフォルダに関連ファイルが配置されいます。

# ライブラリ(仮想環境関連)
~/Library/Application Support/pypoetry

# 設定ファイル
~/Library/Preferences/pypoetry/

# キャッシュファイル
~/Library/Caches/pypoetry/

これらのファイルが残っていると、Poetry を再インストールしても前の設定が残っています。

なので完全にアインストールする場合には、これらのファイルの削除が必要になります。

感想

今回新規機能や、今まで使ったことのない機能を使って、遊んでいたら起きた事故でした。

時間のある時でよかったと安心しつつ、完全にアインストールする方法を知れました。

ではでは、また次回。

Python Poetry 1.2へのアップデート

どうも、nippa です。

Python のパッケージ管理に Poetry を利用していますが、バージョン 1.2 がリリースされたので、1.1 から 1.2 へアップデートしてみました。

いくつか設定変更がありましたので、記事にしておきます。

環境

  • macOS 12.6
  • poetry 1.1.14 -> 1.2

Poetry 1.2 の変更点

  1. poetry インストラーの URL が https://install.python-poetry.org に変更
  2. python2.7 でのプロジェクト管理サポート終了
  3. python 2.7, 3.5, 3.6 のランタイムサポート終了
  4. 依存関係グループ機能を実装
  5. Plugin 機能を実装
  6. self add が可能に

詳細は公式のブログを参照してください。

Poetry の新規インストール

Poetry のインストール用の URL が変更になっているので、メモしておきます。

# Linux, macOS, Windows (WSL)
curl -sSL https://install.python-poetry.org | python3 -

# Windows (Powershell)
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

1.1 の URL は以下です。

$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3 - --uninstall

Poetry 1.1 -> 1.2 へのアップデート

poetry のアップデートは以下のコマンドで行えます。

poetry self update

アップデートにより、パッケージ管理パスが変更になっていますので、手動で修正する必要があります。

# バージョンの出力
poetry --version

# 出力結果
Configuration file exists at /Users/<user>/Library/Application Support/pypoetry, reusing this directory.

Consider moving configuration to /Users/<user>/Library/Preferences/pypoetry, as support for the legacy directory will be removed in an upcoming release.
Poetry (version 1.2.1)

以下のような違いがあります。

# 1.1のパッケージ管理パス
/Users/<user>/Library/Application Support/pypoetry

# 1.2のパッケージ管理パス
/Users/<user>/Library/Preferences/pypoetry

パッケージ管理ディレクトリの移動を行います。

 mv /Users/<user>/Library/Application\ Support/pypoetry  /Users/<user>/Library/Preferences/pypoetry

移動後は、パッケージ管理パスに関する出力が表示されなくなります。

感想

メジャーバージョンが変更になると、こういった変更が出てきます。

時間がかかるときがあるので、記事に残しておきます。

ではでは、また次回。

Python pytubeでyoutube動画情報取得

どうも、nippa です。

今回はネタ記事で、たまたま見つけた pytube というライブラリを紹介したいと思います。

pytube は 軽量なライブラリで、ライブラリ依存性がない youtube の動画情報をするためのライブラリになります。

動画のダウンロードは法律に触れる可能性があります。また、Youtube利用規約を守って利用ください。くれぐれもご注意ください。

pytube 公式

環境

  • macOS 12.5
  • python3.9
  • pytube 12.1

ライブラリのインストール

  • pip
pip install pytube
  • poetry
poetry install pytube

動画の情報取得

使い方、以下のような形で情報を取得することができます。

from pytube import YouTube

YouTube("Youtube URL").streams.first()

first()で streams(再生設定の種類)の最初のものを指定して、情報を取得しています。

stream の確認

取得可能なストリートを確認します。

from pytube import YouTube

streams = YouTube(
    "Youtube URL"
).streams

for stream in streams:
    print(stream)

上記で、指定した Youtube 動画のストリームが確認でき、前節での first()は表示されたリストの最初のものを示しています。

first()の代わりに last()を利用すると、最後に表示されるストリームを指定することができます。

stream のフィルタリング

filter()を使って、オプションを1つ以上指定することで Stream をフィルタリングすることができます。

from pytube import YouTube

streams = YouTube("Youtube URL").streams

print("all stream")
for stream in streams:
    print(stream)

print("filter by resolution")
for stream in streams.filter(res="1080p"):
    print(stream)

print("filter by fps")
for stream in streams.filter(res="24fps"):
    print(stream)

print("filter by audio type")
for stream in streams.filter(only_audio=True):
    print(stream)

print("filter by mime_type")
for stream in streams.filter(mime_type="video/mp4"):
    print(stream)

print("filter by adaptive(DASH stream)")
for stream in streams.filter(adaptive=True):
    print(stream)

フィルターの種類はいろいろありますが、ソースコードを見るのが一番はやいです。

stream を指定して動画の情報取得

ストリームの詳細を表示すると、各ストリームに itag が振られています。

get_by_itag に int 型で引数を与えると、個別ストリームを取り出すことができます。

from pytube import YouTube

streams = YouTube("Youtube URL").streams
stream = streams.get_by_itag(22)
print(stream)

Playlist の情報取得

play list に登録されている動画情報を取得できます。

from pytube import Playlist

play_list = Playlist("Youtube Play List")

for video in play_list.videos:
    print(f"title: {video.title} URL: {video.watch_url}")

上では、プレイリストの各動画のタイトルと URL を表示しています。

Chanel の情報取得

channel に登録されている動画の情報を取得できます。

from pytube import Channel

channel = Channel("https://www.youtube.com/c/ProgrammingKnowledge")

print(f"チャンネルタイトル: {channel.title}")

for video in channel.videos:
    print(f"title: {video.title} URL: {video.watch_url}")

上ではチャンネルの動画すべてのタイトルとURLを表示しています。

Youtube の検索結果の取得

Search クラスを利用して検索結果の取得ができます。

from pytube import Search

search = Search("検索ワード")

print(len(search.results))
videos, next_continuation = search.fetch_and_parse()
for video in videos:
    print(video.watch_url)

next_continuationを指定することで、次の検索結果を fetch できます。

感想

今回 pytube についてご紹介しました。

動画情報収集をこのライブラリのみでできるのでデータ収集には非常に便利かもしれません。

ダウンロード機能もありますが、法律や利用規約に触れるため今回は紹介しませんでした。

youtubeの規約や動画の著作権がありますので、利用する場合はご注意ください。

ではでは、また次回。

Docker MongoDBの構築

どうも、nippa です。

NoSQL のデータベースを利用したく、MongoDB を docker で構築しようと思います。

今回はMongoDB の公式 imageを利用します。

環境

  • macOS 11.6
  • Docker 20.10
  • MongoDB 5.0.10

ディレクトリ構造(フォルダ構成)

今回のディレクトリ構造(フォルダ構成)は以下のようになっています。

├── docker
│   └── mongodb
│       ├── configdb
│       └── db
└── docker-compose.yml

local のdocker/mongodb/dbを mongo DB のデータを保存するためのディレクトリになっています。

docker-compose ファイル

mongo データベースサーバ + mongo-express の構成になっています。

docker-compose.ymlの内容は以下の通りです。

version: "3"
services:
  mongodb:
    image: mongo
    restart: always
    container_name: mongodb
    hostname: mongodb
    ports:
      - 27017:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=example
    volumes:
      - ./docker/mongodb/configdb:/data/configdb
      - ./docker/mongodb/db:/data/db
    networks:
      - common-link
  mongo-express:
    image: mongo-express
    container_name: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongodb:27017/
    depends_on:
      - mongodb
    networks:
      - common-link
networks:
  common-link:
    driver: bridge

今回はすべてのサービスをbridgeネットワークで構成しています。

必要に合わせて、変更してください。

docker compose の起動

docker-compose.ymlが配置された階層で、以下のコマンドを実行すると、MongoDB と Mongo Express が起動します。

docker compose up -d

起動状況の確認を以下で行います。

docker ps -a

# 出力
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                      NAMES
fe176c480beb   mongo-express   "tini -- /docker-ent…"   10 seconds ago   Up 2 seconds    0.0.0.0:8081->8081/tcp     mongo-express
f6b94f65e9bb   mongo           "docker-entrypoint.s…"   10 seconds ago   Up 10 seconds   0.0.0.0:27017->27017/tcp   mongodb

docker compose の停止

docker-compose.ymlが配置された階層で、以下のコマンドを実行すると、MongoDB と Mongo Express が停止します。

docker compose down

起動状況の確認を以下で行います。

docker ps -a

# 出力
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                      NAMES

Mongo Express へのアクセス

Web ブラウザから localhost:8081にアクセスすると Mongo Exporess が表示されます。

Mongo Express を使ってデータベースの管理を置こうことができます。

ただし、Web には認証がありませんので、本番環境で利用する際はご注意ください。

感想

今回、Mongo DB を Docker 環境で行いました。

次は アプリケーションから Mongo DB を利用してみようと思います。

ではでは、また次回。