Running a python script in matlab

41 次查看(过去 30 天)
Hi, I tried to run a python script in matlab. I used the function system.So fa so good.
The pyhton script uses two input variables. In matlab I can enter one and then it runs without problems but when I try to enter two separate variables I always get an error.
systemCommand = ['python sqd.py ',num2str(a),num2str(omtrek)]
[status, result] = system(systemCommand);
This is the error:
status =
1
result =
Traceback (most recent call last):
File "sqd.py", line 10, in <module>
sys.stdout.write(str(squared(x)))
TypeError: squared() takes exactly 2 arguments (1 given)
Can someone help me?
Thanks!
  1 个评论
Charles
Charles 2017-8-29
This is interesting I am new to python, and I am trying to to do the dame thing Does the solution in fact work? I am keen to try it. I literally do not know python at all, neither am I am a programmer but I find it all fascinating and I move forward by trail and error. Some how I make progress. I will try this, but what infrastructure do you have? I have Matlab, 2017a and Python 3.6 Do i need anything else? I am reading that the former does not support the latter. Any thoughts?

请先登录,再进行评论。

采纳的回答

Friedrich
Friedrich 2013-1-16
编辑:Friedrich 2013-1-16
Hi,
when modifying your script to:
import sys
def squared(a,omtrek):
b = (omtrek/2)-a
return b
if __name__ == '__main__':
x = float(sys.argv[1])
y = float(sys.argv[2])
sys.stdout.write(str(squared(x,y)))
and calling it from MATLAB:
>>!C:\Python32\python.exe sqd.py 1 2
it works fine for me. Or in your way:
>> a = 1
>> omtrek = 2
>>systemCommand = ['C:\Python32\python.exe sqd.py ',num2str(a),' ',num2str(omtrek)]
>> system(systemCommand)
0.0
ans =
0
  1 个评论
Aravind Sasikumar
Aravind Sasikumar 2016-4-18
编辑:Aravind Sasikumar 2016-4-18
Hello, The above code works for me too. The program is running but I am not able to get back the value of b in Matlab. I want to perform further calculations with the value of b.
import sys
def add(a,c):
b=a+c
return b
if _name_ == 'main':
x=float(sys.argv[1])
y=float(sys.argv[2])
sys.stdout.write(str(add(x,y)))
Why am I not getting the value of b back in matlab ?

请先登录,再进行评论。

更多回答(7 个)

Bo Li
Bo Li 2016-4-18
Why not using Python Interface?
The MATLAB statement can be as simple as following:
>> b=py.sqd.squared(10,30)

Shashank Prasanna
Shashank Prasanna 2013-1-15
Could you try the above with a space between the two arguments?
systemCommand = ['python sqd.py ',num2str(a),' ',num2str(omtrek)]

Tom Leblicq
Tom Leblicq 2013-1-16
This is the python script:
import sys
def squared(a,omtrek):
b = (omtrek/2)-a
return b
if __name__ == '__main__':
x = float(sys.argv[1])
sys.stdout.write(str(squared(x)))
It's very easy code, but this is just a test for a more complex program I would like to run.
In python it works. In Matlab it doesn't. It's true that the code needs two inputs. But my question is how can I give two inputs using matlab?

Tom Leblicq
Tom Leblicq 2013-1-16
You are right Friedrich, this works! Thanks!
But by doing this I have another problem. The python code calculates the value of a parameter "b". I need this parameter in matlab for further processing. The correct value appears on my screen but I can't handle it. For example like this:
2.0>>

Aysha Ashraf
Aysha Ashraf 2017-12-21
Can any one help me how to integrate this python code to matlab, i want to run this python program in matlab...
#Load dependencies import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from matplotlib import* import matplotlib.pyplot as plt from matplotlib.cm import register_cmap from matplotlib.mlab import PCA from sklearn.decomposition import PCA
from scipy import stats #from wpca import PCA from sklearn.decomposition import PCA as sklearnPCA import seaborn
#Load movie names and movie ratings movies = pd.read_csv('movies.csv') ratings = pd.read_csv('ratings.csv') ratings.drop(['timestamp'], axis=1, inplace=True) # def replace_name(x): return movies[movies['movieId']==x].title.values[0] # ratings.movieId = ratings.movieId.map(replace_name) # M = ratings.pivot_table(index=['userId'], columns=['movieId'], values='rating') m = M.shape #posesall = pd.read_csv('FileName_Poses.csv') df1 = M.replace(np.nan, 0, regex=True) X_std = StandardScaler().fit_transform(movies) #Step 2: Covariance Matrix and Eigendecomposition mean_vec = np.mean(X_std, axis=0) cov_mat = (X_std - mean_vec).T.dot((X_std - mean_vec)) / (X_std.shape[0]-1) print('Covariance matrix \n%s' %cov_mat) print('NumPy covariance matrix: \n%s' %np.cov(X_std.T)) #Perform eigendecomposition on covariance matrix cov_mat = np.cov(X_std.T) eig_vals, eig_vecs = np.linalg.eig(cov_mat) print('Eigenvectors \n%s' %eig_vecs) print('\nEigenvalues \n%s' %eig_vals) # Step 3: Selecting Principal Components # Visually confirm that the list is correctly sorted by decreasing eigenvalues eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))] print('Eigenvalues in descending order:') for i in eig_pairs: print(i[0]) pca = PCA(n_components = 93) All_poses_pca = pca.fit_transform(movies) Variance = (pca.explained_variance_ratio_)
#Explained variance pca = PCA().fit(X_std) plt.plot(np.cumsum(pca.explained_variance_ratio_)) plt.title('Scree Plot') plt.xlabel('Number of principal components') plt.ylabel('Cumulative explained variance') plt.show()

Yodish
Yodish 2018-4-12
It works for me as well, but it is very slow. It takes 0.2 sec to call a sum function from Python
Any ideas on how to speed it up? Where is the bottle neck?

Agapi Dav
Agapi Dav 2018-7-31
Hello everyone! I have some images read in matlab and I want to process them in python and them return them to matlab for further processing.
Everything with the systemCommand works, however, even though I can import variables from matlab to python, because they are already in the workspace, I cannot return variables (e.g. images) back to matlab, when running the python script. Till now, in order to make it work, I save the python-processed images and then read them again from matlab.
I would like to ask if there is a more efficient way. In other words, in the example of Tom Leblicq, I would like to return the parameter b in matlab for further processing.
Thank you in advance!
  1 个评论
Abdelwahab Afifi
Abdelwahab Afifi 2021-1-12
The following command will return b in the workspace of MATLAB
b=py.sqd.squared(2)

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Call Python from MATLAB 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by