Linux(Manjaro).pyファイルからQMLタイプを推論する

Linux(Manjaro).pyファイルからQMLタイプを推論する

まず、この記事は最初の投稿なので、正しい指示に従い、問題を明確にしたことを願っています。

私は個人的にLinuxに慣れていませんし、Windows上でほとんどのことをしますが、時にはいくつかのコードを実行するためにLinuxを使用します。より正確に言えば、仮想マシンでManjaroを実行すると、次の問題が発生しました。

今日はPyQt5ライブラリを使って小さな不快感を発見しました。通常、Linuxでは、.pyで終わるすべてのファイルがPythonスクリプトであると仮定します。ただし、PyQtをインポートし、すべての種類の{角括弧を含むコードがある場合、Manjaroはすぐにそれを「Qt Markup Language」ファイルとしてリストします。以下は、「test.py」として保存された問題を複製するためのダミーコードです。

#!/usr/bin/env python3
from PyQt5 import QtWidgets
some_dict = {}

Shebangを追加しても多くのことは起こりません。 2行目または3行目を削除すると、OSはファイル形式が「Pythonスクリプト」と呼ばれますが、両方を保持すると角括弧のためにQML(Qt Markup Language File)と推定されます(仮定)。これは、f'' または .format() で文字列形式を指定する場合にも発生するため、これは単なる辞書の問題ではないことがわかります。

これは私のコードには影響しませんが、まだ少し迷惑であり、次の方法を知りたいです。

  1. Linuxは拡張子にあまり気にしないので、ファイル形式を推論します。
  2. 迅速な解決策があれば、どのように変更できますか?

先ほど述べたように、特に編集のために端末を使用しているので、それはあまり問題ではありませんが、迷惑だと思います。助けてくれてありがとう。良い一日をお過ごしください!

アップデート1: ウィキを探してみるとこんな内容がありました。https://wiki.archlinux.org/index.php/XDG_MIME_Applications#mimeapps.list

これらの例は正常に再現できますが、これまでは.pyファイルに適用するのに問題があります。新しいルールを設定した後でも、/usr/share/mime にある構成ファイルに移動するようです。

アップデート2: 拡張子が.pyの場合、QMLを正常にオーバーライドするルールを作成できません。しかし、import文を次のように置き換えると

import PyQt5.QtWidgets as QtWidgets

その後、ルールを「欺く」ことができ、今では「Pythonスクリプトファイル」として正常にフラグを立てました。 「問題」自体が解決されたわけではありませんが、それから多くを学びました。

答え1

通常、Linuxでは、.pyで終わるすべてのファイルがPythonスクリプトであると仮定します。

カーネルとしての Linux は、実際にはファイルの終了を気にしません。ファイルが次に終了することを確認してください。 シェルボーンまたは、次の魔法の数0x7Fの後にELF(45 4c 46)が続くと、ELFを意味します。

現在のバージョンのSlackware 64でこの問題を再現できます1.8.14 (Xfce 4.12)。 Thunar自体はファイル形式を推論するのではなく、代わりに以下を使用します。 ジェスチャー広大極他のプログラムでも使用されるデータベース:

$ grep mime /proc/$(ps -C thunar -o pid:1=)/maps
7f2c3a709000-7f2c3a730000 r--s 00000000 08:01 1055508                    /usr/share/mime/mime.cache

xdg-mime query filetype以下で呼び出されるPerlプログラムを使用して、特定のファイルのMIMEタイプを確認できます。mimetypeperl-file-mimeinfo

$ mimetype test.py
test.py: text/x-qml

そして、指定されたMIMEタイプが選択された理由を確認するには、-Dwithを使用します。mimetype

$ mimetype -D test.py
> Data dirs are: /home/ja/.local/share, /usr/local/share, /usr/share
> Checking inode type
> Value "import Qt" at offset 3044 matches at /usr/share/mime/magic line 120
>> Value "{" at offset 3065 matches at /usr/share/mime/magic line 121
test.py: text/x-qml

ご覧のとおり、この場合mimetypetest.pytext/x-qml には次のものが含まれています。import Qt そして大きな括弧。 test.pyが次の場合:

#!/usr/bin/env python3

from PyQt5 import QtWidgets

mimetypeimport Qt中かっこなしで見つけることができるので、Pythonスクリプトと報告します。

$ mimetype -D test.py
> Data dirs are: /home/ja/.local/share, /usr/local/share, /usr/share
> Checking inode type
> Value "import Qt" at offset 3044 matches at /usr/share/mime/magic line 120
> Failed nested rules
> Checking globs for basename 'test.py'
> Checking for extension '.py'
test.py: text/x-python

興味深いことに、ifはPerlスクリプトであると主張するためにthentest.pyに名前が変更されました。test.plmimetype

OTOH、file名前を変更してもPythonスクリプトです。

$ file test.pl
test.py: Python script, ASCII text executable

mimetypeとの違いを理解するには、この回答を参照してくださいfile"file --mime-type"および"mimetype"コマンドは異なる結果を返します。

関連情報