Reputation: 6680
I am using Fabric and would like to use fexpect. I have the following Python script:
from ilogue.fexpect import expect, expecting, run
(...)
def install_postgresql(profile):
print("!!! Installing PostgreSQL...")
print(' -> Doing pre-cleanup...')
# Remove PostgreSQL if it exists
prompts = []
prompts += expect('Do you want to continue [Y/n]? ', 'Y')
with settings(warn_only=True):
with expecting(prompts):
run('sudo apt-get purge postgresql')
print(' -> Doing actual installation...')
# Install PostgreSQL
prompts = []
prompts += expect('Do you want to continue [Y/n]? ', 'Y')
with expecting(prompts):
run('sudo apt-get install postgresql')
# In some cases PostgreSQL has issues with Ubuntu's default kernel params
# that prevent PostgreSQL to start automatically, so we try to start it
# TODO: Fix it
with settings(warn_only=True):
run('sudo service postgresql start')
When executing I get the following error:
[xxx.xxx.xxx.xxx] out: Traceback (most recent call last):
[xxx.xxx.xxx.xxx] out: File "/tmp/fexpect_MbW3QP6Zpy5KBjBGQcaYxi", line 4, in <module>
[xxx.xxx.xxx.xxx] out: import pexpect
[xxx.xxx.xxx.xxx] out: ImportError: No module named pexpect
I am using virtualenv and pexpect is actually installed:
(venv)PALM00545424A:woopup i841712$ pip install pexpect
Requirement already satisfied (use --upgrade to upgrade): pexpect in ./venv/lib/python2.7/site-packages
Upvotes: 14
Views: 79193
Reputation: 1
I got the same error when using pexpect lib to interact with gatttool. I used Pycharm to remote debug code on Raspberry pi. Here is the command processed by Pycharm and the error output
sudo+ssh://[email protected]:22/usr/bin/python3 -u /tmp/pycharm_project_55/Rasp_Pi/BluetoothBLEComm.py
Traceback (most recent call last):
File "/tmp/pycharm_project_55/Rasp_Pi/BluetoothBLEComm.py", line 33, in <module>
import pexpect
ModuleNotFoundError: No module named 'pexpect'
After spending few hours, I identified the issue is with the option I checked while configuring the Remote Python Interpreter in Pycharm. It is the option that executes code with root privileges via sudo.
**sudo**+ssh://[email protected]:22/usr/bin/python3...
The pexpect package was only installed for my local pi3 user. So to solve the issue either I had to install pexpect using sudo or uncheck the option that executes the code with root privileges.
Upvotes: 0
Reputation: 2558
In fact if your script uses fexcept, the command you need to run is actually:
sudo -E pip install fexpect
Upvotes: 3
Reputation: 7246
Not a direct answer to your question, but tools like chef, puppet or salt are more suitable for installing system packages.
Upvotes: 0
Reputation: 6680
Found the solution.
pexpect was not part of the remote machine's Python installation.
I simply executed
sudo -E pip install pexpect
on the remote machine.
Upvotes: 21