まず、この記事は最初の投稿なので、正しい指示に従い、問題を明確にしたことを願っています。
私は個人的に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() で文字列形式を指定する場合にも発生するため、これは単なる辞書の問題ではないことがわかります。
これは私のコードには影響しませんが、まだ少し迷惑であり、次の方法を知りたいです。
- Linuxは拡張子にあまり気にしないので、ファイル形式を推論します。
- 迅速な解決策があれば、どのように変更できますか?
先ほど述べたように、特に編集のために端末を使用しているので、それはあまり問題ではありませんが、迷惑だと思います。助けてくれてありがとう。良い一日をお過ごしください!
アップデート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タイプを確認できます。mimetype
perl-file-mimeinfo
$ mimetype test.py
test.py: text/x-qml
そして、指定されたMIMEタイプが選択された理由を確認するには、-D
withを使用します。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
ご覧のとおり、この場合mimetype
test.pytext/x-qml
には次のものが含まれています。import Qt
そして大きな括弧。 test.pyが次の場合:
#!/usr/bin/env python3
from PyQt5 import QtWidgets
mimetype
import 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.pl
mimetype
OTOH、file
名前を変更してもPythonスクリプトです。
$ file test.pl
test.py: Python script, ASCII text executable
mimetype
との違いを理解するには、この回答を参照してくださいfile
。"file --mime-type"および"mimetype"コマンドは異なる結果を返します。。