[英]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.