Linux (Manjaro) 从 .py 文件推断 QML 类型

Linux (Manjaro) 从 .py 文件推断 QML 类型

首先,这是我的第一篇文章,所以我希望我遵循正确的指导方针并清楚地说明问题。

我个人不太精通 Linux,只是偶尔用它来做一些代码,尽管我大部分都是在 Windows 中完成的。更准确地说,我在虚拟机上运行 Manjaro 时遇到了以下问题。

今天,在使用 PyQt5 库时,我注意到一个小烦恼。一般来说,Linux 假定所有以 .py 结尾的文件都是 python 脚本。但是,如果我碰巧有一些导入 PyQt 并且具有任何类型的 { 括号的代码,那么 Manjaro 会立即将其列为“Qt 标记语言”文件。这是一些复制问题的虚拟代码,保存为“test.py”

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

添加 shebang 并没有多大作用。如果我删除第二行或第三行,操作系统会说它的文件类型是“Python script”,但如果我保留两者,那么它会因为括号而将其推断为 QML(Qt 标记语言文件)(我假设)。如果我用 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 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

您可以使用fromxdg-mime query filetype调用的 Perl 程序 来检查给定文件的 MIME 类型:mimetypeperl-file-mimeinfo

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

并使用-Dwithmimetype来检查为什么选择给定的 MIME 类型:

$ 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.py 是text/x-qml 因为它包含import Qt 大括号。如果 test.py 看起来像这样:

#!/usr/bin/env python3

from PyQt5 import QtWidgets

mimetype报告它是一个 Python 脚本,因为即使它可以找到import Qt没有花括号:

$ 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

有趣的是,iftest.py被重命名为test.plthenmimetype 声称它是 Perl 脚本。

OTOH,file即使在重命名之后,它仍然是一个 Python 脚本:

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

请参阅此答案以了解mimetype和之间的差异file“file --mime-type”和“mimetype”命令返回不同的结果

相关内容