우선, 이 글은 첫 번째 게시물이므로 올바른 지침을 따르고 문제를 명확하게 밝혔기를 바랍니다.
저는 개인적으로 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을 추가해도 많은 일이 발생하지 않습니다. 두 번째 또는 세 번째 줄을 제거하면 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.py text/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 스크립트임을 주장하기 위해 then test.py
으로 이름이 바뀌었습니다 .test.pl
mimetype
OTOH, file
이름을 바꾼 후에도 여전히 Python 스크립트입니다.
$ file test.pl
test.py: Python script, ASCII text executable
mimetype
와 의 차이점을 이해하려면 이 답변을 참조하세요 file
."file --mime-type" 및 "mimetype" 명령은 다른 결과를 반환합니다..