簡體   English   中英

如何使用PHP運行python腳本並創建文件?

[英]How to run a python script using PHP and create a file?

我正在嘗試在PHP中實現的后端中運行python腳本的POC。 Web服務器是Docker容器中的Apache。

這是PHP代碼:

$command = escapeshellcmd('/usr/local/test/script.py');
        $output = shell_exec($command);
        echo $output;

當我使用后端執行python腳本時,我們收到創建文件的權限被拒絕錯誤。

我的python腳本:

#!/usr/bin/env python

file = open("/tmp/testfile.txt","w+")

file.write("Hello World")

file.close()

這是我得到的錯誤:

IOError:[Errno 13]權限被拒絕:'testfile.txt'

對於使用權限的目錄,如下所示,

drwxrwsr-x 2 1001 www-data 4096 5月8日05:35。

drwxrwxr-x 3 1001 1001 4096 5月3日08:49 ..

有什么想法嗎? 我該如何克服這個問題?

任何腳本環境中都具有相對路徑是非常不好的做法。 首先,重寫代碼以使用完整路徑,例如/usr/local/test/script.py/tmp/testfile.txt 我的猜測是您的腳本正在嘗試寫入與您認為不同的位置。

當您確切知道文件的寫入位置時,請轉到目錄並運行ls -la並檢查目錄的權限。 您希望它可以由Web服務器運行時的同一用戶或組寫入。

查看您顯示的權限,您沒有用戶可以寫目錄,只有所有人和組都可以。 您需要添加用戶寫權限chmod u+w /tmp將完成此工作。

我相信問題是您正在嘗試寫入/tmp/目錄中的現有文件。 通常, /tmp/ 會設置粘性權限位。 這意味着只有文件所有者才有權寫入或刪除它。 如果在父目錄上設置了sticky位,則文件的組寫權限無關緊要。

因此,如果這是您的/ tmp的內容

$ ls -al /tmp

drwxrwxrwt  5 root  root       760 Apr 30 12:00 .
drwxr-xr-x 21 root  root      4096 Apr 30 12:00 ..
-rw-rw----  2 1001  www-data    80 May  8 12:00 testfile.txt

我們可能假設www-data組中的用戶應該能夠寫入testfile.txt 但是,由於並非如此. (/ tmp /目錄本身)設置了粘滯位(權限部分中的t指示了這一點)。

之所以在此處設置粘性位,是因為每個人都應該能夠在此處寫入文件,而不必擔心其他用戶可能會修改我們的臨時文件。

為避免權限錯誤,可以使用標准庫tempfile模塊。 這段代碼將創建一個唯一的文件名,例如testfile.JCDxK2.txt ,因此testfile.txt已存在都沒有關系。

#!/usr/bin/env python

import tempfile

with tempfile.NamedTemporaryFile(
        mode='w',
        prefix='testfile.',
        suffix='.txt',
        delete=False,
    ) as file:
    file.write("Hello World")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM