Running Python script from Creator project
-
Hi
I am a little new to Qt Creator. I want to run a python script after a click in Qt Creator project. I also viewed this: http://www.qtcentre.org/archive/index.php/t-68641.html and it actually worked. But when I pass on an argument like a path to the JSON file, eg: "abc.json" to the following code,
QString program( "python" ); QStringList args = QStringList() << "read_json.py"<<"abc.json"; QProcess p; p.setWorkingDirectory(WorkingDir); int exitCode = p.execute( program, args );
It gives me the following error.
Unexpected error: <class 'json.decoder.JSONDecodeError'>
Traceback (most recent call last):
File "read_json.py", line 509, in <module>
data = json.load(JSON)
File "/home/user/anaconda3/lib/python3.6/json/init.py", line 299, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "/home/user/anaconda3/lib/python3.6/json/init.py", line 354, in loads
return _default_decoder.decode(s)
File "/home/user/anaconda3/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/home/user/anaconda3/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)But when I run the same manually in terminal by typing "python read_json.py abc.json", it runs fine. Can someone give a solution to this error?
-
Hi @user241996,
Just a guess, but it may be your read_json.py does not find the abc.json?
Can you specify the /complete/path/to/abc.json?
-
This post is deleted!
-
Hi and welcome to devnet,
As a simple debugging technique, did you try to print the content of the JSON file from your script ? That way you should be able to ensure that the file is properly found.
-
@SGaist
Name of JSON: /home/user/Desktop/FConnectivityAnl/FConnectivityAnlDesign.json
<_io.TextIOWrapper name='/home/user/Desktop/FConnectivityAnl/FConnectivityAnlDesign.json' mode='r' encoding='UTF-8'>
Unexpected error: <class 'json.decoder.JSONDecodeError'>
Traceback (most recent call last):
File "read_json.py", line 509, in <module>
data = json.load(JSON)
File "/home/user/anaconda3/lib/python3.6/json/init.py", line 299, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "/home/user/anaconda3/lib/python3.6/json/init.py", line 354, in loads
return _default_decoder.decode(s)
File "/home/user/anaconda3/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/home/user/anaconda3/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)When the same is run manually, it gives the following that means it runs fine. I have already debugged my file.
user@xyz-OptiPlex-9030-AIO:~/Desktop/funcConn/funcConnGUI/Scripts$ python read_json.py /home/user/Desktop/FConnectivityAnl/FConnectivityAnlDesign.json
Name of JSON: /home/user/Desktop/FConnectivityAnl/FConnectivityAnlDesign.json
<_io.TextIOWrapper name='/home/user/Desktop/FConnectivityAnl/FConnectivityAnlDesign.json' mode='r' encoding='UTF-8'>
Made mask for the ttest: /home/user/Desktop/FConnectivityAnl/tmp/mask_for_ttest.nii.gz
Functional Files in this group: ['/home/user/Desktop/sub-0050952/func/sub-0050952_task-rest_run-1_bold.nii.gz', '/home/user/Desktop/sub-0050952/func/sub-0050952_task-rest_run-1_bold.nii.gz', '/home/user/Desktop/sub-0050952/func/sub-0050952_task-rest_run-1_bold.nii.gz']
171211-14:35:47,488 workflow INFO:
Workflow CorrCalc_group0 settings: ['check', 'execution', 'logging']
171211-14:35:47,492 workflow INFO:
Running in parallel.
171211-14:35:47,494 workflow INFO:
Executing: coff_matrix ID: 0
171211-14:35:47,496 workflow INFO:
Adding 3 jobs for mapnode coff_matrix
171211-14:35:47,499 workflow INFO:
Executing: _coff_matrix0 ID: 2
..
..
.. -
I have two further ideas:
- Is the same python interpreter run when you call the script from your program or from command line?
- The environment may be different. The script started by QProcess inherits the environment from your app. If you ran your app from QtCreator, your app inherits the environment from QtCreators run environment. Some variable like PATH or LD_LIBRARY_PATH may influence your script...
-
@aha_1980 They both call the same interpreter and the json called is also same i.e.
/home/user/anaconda3/bin/python
/home/user/anaconda3/lib/python3.6/json/init.pyI checked this by putting
print(sys.executable) print(os.path.abspath(json.__file__))
-
Hence my suggestion to just print the content of that file and not try to load it. I'm not saying its content is wrong. It is just to ensure that your python script gets correctly called with the right parameters. I'd print the parameters received by the script, then try to just open the file and dump its content.
-
@SGaist Your comment was very helpful. I checked the contents by printing them and saw that when I called the process, the file was still being written (since I write a JSON file from the GUI). So I added one more line
QFile.close()
and now the python script is called only after JSON gets written from the GUI. Now it is running fine.