I thought I throw together a little dirty script on our server (Ubuntu 16.04) that gives me some plain text output from Python.
I want to call the script like this from PHP (I know there should be some escaping done, but it's just a test currently):
<?php
$command = '/usr/local/bin/script.py';
$output = shell_exec($command);
echo $output;
?>
This is script.py
owned by www-data mode 774
#!/usr/bin/python
import CoolProp.CoolProp as CP
import argparse
print('Hallo Welt')
If I comment out the CoolProp
import it works. But somehow the package cannot be reached by www-data
and so the script returns nothing.
As you see I want to use the Package CoolProp
.
pip install CoolProp
=> That works for my local user. But now when called from user www-data
--target=/usr/local/lib/site-packages/
but that did not help.site-packages/
to rwx
for www-data but that does not work as well.In the end: What is the simplest way to pip install
a package that can be used by all users including www-data
?
As a best practice, you should always install Python and the packages you need into a separate virtual environment for each project. This creates an isolated environment that will avoid many of the problems that arise because of shared libraries/ dependencies.
Passing the --user option to python -m pip install will install a package just for the current user, rather than for all users of the system.
Use the pip install -r requirements. txt command to install all of the Python modules and packages listed in your requirements. txt file.
I recommend that you try the solution that xotihcan posted first as that is the easy way to make most python modules available to all users including www-data. However it doesn't work for every python module. If that doesn't work for you or you just want to install modules for the www-data user only then use the following commands:
sudo mkdir /var/www/.local
sudo mkdir /var/www/.cache
sudo chown www-data.www-data /var/www/.local
sudo chown www-data.www-data /var/www/.cache
sudo -H -u www-data pip install CoolProp
I had this same issue trying to make the Python pyro4 module available for the www-data use. There is another way to do it but it involves some even dirtier hackery. For more details check out my question/answer @ How do I properly call a Python Pyro client using PHP and Apache web server?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With