如何更改 shell 腳本的工作目錄

如何更改 shell 腳本的工作目錄

我有一個 Python 腳本,可以在相對目錄中找到檔案。例如:Python 腳本位於/home/username/projectname/.我有一個在 Python 腳本中調用的文件,該文件位於/home/username/projectname/subfolder.

如果我從 shell 運行腳本,python scriptname.py它運行得很好。

但是,我正在嘗試將該腳本作為啟動服務運行。我正在 webmin 中設置它,並且我相信它創建了一個 shell 腳本來調用它。透過啟動腳本,我正在執行類似的操作來呼叫腳本:

execute python home/username/projectname/scriptname.py

腳本啟動正常,但無法存取相對目錄中的檔案。

我猜有一種更好的方法可以從啟動腳本中呼叫Python程序,以便它知道相對路徑。

答案1

又快又髒:

在啟動腳本中,不要只執行 python 腳本,而是cd先使用。

#!/bin/sh

cd /home/username/projectname &&
python ./scriptname.py

答案2

有幾種方法可以直接在 Python 腳本中解決這個問題。

  1. 如果您的腳本始終位於「/home/username/projectname/subfolder」中,您只需將其新增至 Python 內的搜尋路徑即可:

    import sys
    sys.path.append("/home/username/projectname/subfolder")
    

    但是,我懷疑您可能會將其放在多個“projectname”目錄中,因此更通用的解決方案如下所示:

    import sys
    import os
    sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "subfolder"))
    

    這將找到 Python 腳本所在的目錄(在 中sys.argv[0]),提取目錄部分,將「子資料夾」附加到其上,並將其放入搜尋路徑中。

    請注意,某些作業系統可能只給予可執行檔名稱sys.argv[0]。對於這種情況,我沒有一個好的解決方案,也許其他人有。如果有相對路徑,您可能還需要os.path.abspath()在其中註入一個調用sys.argv[0],但是稍微嘗試一下,您應該能夠讓它工作。

  2. 與上面的答案類似,您可以讓 Python 腳本自行更改目錄,而不需要包裝器腳本:

    import os
    os.chdir("/home/username/projectname")
    

答案3

一種更快、更髒的方法(使用子 shell):

( cd my/path/to/folder && python myprogram.py )

答案4

set PYTHONPATH=PROJECTPATH && python script.py

相關內容