2016-08-21 145 views
1

我剛剛通過pip安裝了retext。我必須爲它下載圖標,但我意識到它不起作用(菜單上沒有圖標),除非我在retext文件夾中運行「retext」。這是什麼「加入」在做什麼?

我試圖解決它,但我的蟒蛇技能不是很強。

目前,我強制icon_path有我想要的路徑。

#icon_path = 'icons/' 
icon_path = '/usr/local/lib/python3.5/site-packages/retext/icons/' 

有人能告訴我這條線是如何工作的嗎?

datadirs = [join(d, 'retext') for d in datadirs] 

謝謝。

import sys 
import markups 
import markups.common 
from os.path import dirname, exists, join 

from PyQt5.QtCore import QByteArray, QLocale, QSettings, QStandardPaths 
from PyQt5.QtGui import QFont 

app_version = "6.0.1" 

settings = QSettings('ReText project', 'ReText') 

if not str(settings.fileName()).endswith('.conf'): 
     # We are on Windows probably 
     settings = QSettings(QSettings.IniFormat, QSettings.UserScope, 
       'ReText project', 'ReText') 

datadirs = QStandardPaths.standardLocations(QStandardPaths.GenericDataLocation) 
datadirs = [join(d, 'retext') for d in datadirs] 

if sys.platform == "win32": 
     # Windows compatibility: Add "PythonXXX\share\" path 
     datadirs.append(join(dirname(sys.executable), 'share', 'retext')) 

if '__file__' in locals(): 
     datadirs = [dirname(dirname(__file__))] + datadirs 

#icon_path = 'icons/' 
icon_path = '/usr/local/lib/python3.5/site-packages/retext/icons/' 
for dir in datadirs: 
     if exists(join(dir, 'icons')): 
       icon_path = join(dir, 'icons/') 
       break 
+4

'join'來自您的最終導入語句:'from os.path import dirname,exists,join'。它用於組合路徑段。有關更多信息,請參閱os.path上的官方python文檔。 'datadirs = [join(d,'retext')for d in datadirs]'是一個[list comprehension](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions) 'datadirs'中的目錄路徑與路徑段''retext''。你基本上是得到'datadirs'中每個目錄路徑的retext子文件夾。 –

回答

1

這是os.path.join()

os.path.join(path, *paths)

加入一個或多個路徑組件智能化。返回值是路徑和*paths的任意成員的連接,在除最後一個非空部分之後,只有一個目錄分隔符(os.sep),這意味着如果最後一部分爲空,結果將僅在分隔符中結束。如果某個組件是絕對路徑,則所有先前的組件都將被丟棄,並從絕對路徑組件繼續加入。

在此輸入:

from os.path import dirname, exists, join 

所以,在這個行:

datadirs = [join(d, 'retext') for d in datadirs] 

[ ... ]是一個列表理解是建立的結果列表join(d, 'retext')應用於datadirs列表中的每個目錄。

所以,如果datadirs包含:

['/usr/local/test', '/usr/local/testing', '/usr/local/tester'] 

然後:

[join(d, 'retext') for d in datadirs] 

將產生:

['/usr/local/test/retext', '/usr/local/testing/retext', '/usr/local/tester/retext'] 

與設置的問題:

icon_path = '/usr/local/lib/python3.5/site-packages/retext/icons/' 

是否在for循環中被覆蓋,因此除非找到正確的路徑,否則它將被覆蓋。