I've been adding a plugin to an existing project, and the thing is tied together with a perl script. I'm trying to add my C program into the perl script to make an output file, but the output is garbage or missing.
My executable is called Interpolate and when it's in the same folder as the perl script it's working just fine
./Interpolate inv.tracking_log
Is how the command is run. It should produce an intermediate filecalled tmp.log, and a final file called out.txt. When I run it in the directory it does just fine, both files are as they should be.
So then I added a system call into the perl script (I barely (if that) know perl):
print("./Interpolate $inVideoFile"); //prints like the command (just a test)
my $interCall = system("./Interpolate $inVideoFile");
When running it from within the perl script, the tmp.log file is mostly garbage, and out.txt is missing entirely. I do realize out is most likely missing because it has a dependency on the tmp.log file. Is there a perl 'gotchya' that I'm missing somewhere?
system("./Interpolate $inVideoFile");
should be
system("./Interpolate", $inVideoFile);
If you still have a problem after fixing that, $inVideoFile doesn't contain what it should, or there's a bug in your C program. (What is the return value of the system call?)
Related
Using Shake, to create an mp3 (this is just a learning example), I use lame, and then id3v2 to tag it.
If the lame succeeds, but the id3v2 fails, then I'm left with the mp3 file in place; but of course it is "wrong". I was looking for an option to automatically delete target files if a producing command errors, but I can't find anything. I can do this manually by checking the exit code and using removeFiles, or by building in a temporary directory and moving as the last step; but this seems like a common-enough requirement (make does this by default), so I wonder if there's a function or simple technique that I'm just not seeing.
The reason Make does this by default is that if Make has a partial incomplete file on disk, it considers the task to have run successfully and be up to date, which breaks everything. In contrast, Shake records that a task ran successfully in a separate file (.shake.database), so it knows that your mp3 file isn't complete, and will rebuild it next time.
While Shake doesn't need you to delete the file, you might still want to so as to avoid confusing users. You can do that with actionOnException, something like:
let generateMp3 = do cmd "lame" ... ; cmd "id3v2" ...
let deleteMp3 = removeFile "foo.mp3"
actionOnException generateMp3 deleteMp3
I am new here.
Could anyone help me, on how to use yarpgen to generate a random c program.
I tried running the run_gen.py script that I saw in the yarpgen readme.
But, I got a warning and an error like this:
Warning: please set YARPGEN_HOME envirnoment variable to point to test generator path, using C:\Users\..\Python\Python36-32\yarpgen-master for now
and
File C:\Users\..\Python\Python36-32\yarpgen-master\yarpgen wasn't found
Any help would be much appreciated.
Thanks in advance !
The warning very likely points to the source of the problem, run_gen does not know where the other parts of yarpgen are installed.
First, note down the directory you installed/copied yarpgen to.
Then open a command shell. Type this:
cd <where run_gen.py is>
set YARPGEN_HOME=<the path you just noted down>
run_gen.py
If this works, you can write a batch script, that contains the set YARPGEN_HOME=... line and then calls run_gen.py. If the directory where run_gen.py is located is not on your PATH environment variable, call run_gen.py with the full absolute path in the batch script:
set YARPGEN_HOME=<the path to yarpgen>
python3 <absolute_path_to>\run_gen.py
Then you can call your batch script.
You may have to adjust the python3 command depending on the executable Python 3 installed on your machine (it may be just python on Windows).
When I tried this after building with cygwin, I noticed that I had to rename yarpgen.exe to yarpgen to make it work.
I try to run a C implementation of Sift feature descriptor executable from matlab at linux. The script I run and the executable at the some folder and executable is run by the following
./sift <tmp.pgm >tmp.key
and I trued to run it on Matlab with followings but none of them worked
eval('!./sift <tmp.pgm >tmp.key');
system('./sift <tmp.pgm >tmp.key');
unix('./sift <tmp.pgm >tmp.key');
I also check the executable from terminal and it works without any flaw. Is there any other way to do that or Do i have any slight mistake?
Your syntax looks right.
The -1 status means it's probably failing to find or launch sift at all. I know this is basic (and I think someone else mentioned it), but is your Matlab program running from the same directory that sift is in when it calls it? The system() function evaluates paths with respect to the Matlab session's current directory, not the location of the calling script. If your script has called cd for other reasons, that'll affect it. Check your current directory with pwd and do an ls and exist('./sift', 'file') to make sure it's there.
If this is the case, you could make it more robust by calling sift with an absolute path, maybe calculated at run time using fileparts(mfilename('fullpath')) in the script.
I figure out the problem as the path /matlab/bin/glnxa64/matlab_helper has permission problem. After I check the problem, everything started to work correctly.
I had the same problem of permission. Just adding solution for others to see as i had hard time finding the solution.
Open terminal and type
cd \path_of_your_file
sudo chmod -R 777
it will ask for your password and will permit to run the exe. Hugs..
I need a shell script which will allow me to typeset Lilypond files from TextWrangler (A Mac App).
So far I have come up with this:
#!/bin/sh
/Applications/LilyPond.app/Contents/Resources/bin/lilypond -o $1
which, of course, doesn't work. (That's why I'm at Stack Overflow.)
When I run that script from the shebang menu in TextWrangler, I get this output:
/Applications/LilyPond.app/Contents/Resources/bin/lilypond: option faultpaper,
--output'' requires an argument
What gives?
I'm running Snow Leopard, TextWrangler, and Lilypond.
Help appreciated.
EDIT: Found a way to get the document path in a Unix Script launched by TextWrangler, so I've rewritten this.
There are multiple ways to work with scripts in TextWrangler through the #! menu, and I'm not sure which one you're trying to use. It looks, though, like you're trying to create a Unix Script to convert your LilyPond document.
As your error hints, Unix Scripts unfortunately aren't given any arguments at all, so $1 will be empty. However, it turns out that recent versions of BBEdit/TextWrangler do set some environment variables before running your script (see BBEdit 9.3 Release Notes and scroll down to Changes). In particular, you can use the following environment variable:
BB_DOC_PATH path of the document (not set if doc is unsaved)
So, save this script to ~/Library/Application Support/TextWrangler/Unix Support/Unix Scripts and you should be good to go.
Other ways you might be trying to do this that don't work well:
Using a Unix Filter: to do this you would have to select all of your LilyPond code in the document, and it would be saved into a temporary file, which is passed as an argument to your script. OK, so that gets you an input filename, at the cost of some hassle. But then the output of that script (i.e. the LiiyPond compiler output) by default replaces whatever you just selected, which is probably not what you want. Wrong tool for the job.
Using #! → Run on a LilyPond file: This involves putting a #! line at the top of your file and having TextWrangler attempt to execute your file as a script, using the #! as a guide to selecting the script interpreter. Unfortunately, the #! line only works with certain scripting languages, and LilyPond (not quite a scripting language) isn't one of them. This is what Peter Hilton is trying to do, and as he notes, you will get LilyPond syntax errors if you try to add a #! line to the top of a LilyPond file. (If you're curious, there is technically a way to get #! → Run to work, which is to embed your LilyPond code inside an executable shell or perl script, using here-document syntax. But this is a gross hack that will quickly become unwieldly.)
There are a few limitations to the script linked above:
It doesn't check to see whether you saved your document before running LilyPond. It would be nice to have TextWrangler automatically save before running LilyPond.
It can't take snippets of text or unsaved documents as input, only saved documents.
You can make more sophisticated solutions that would address these by turning to AppleScript. Two ways of doing this:
Create a script that's specific to TextWrangler and drop it in ~/Library/Application Support/TextWrangler/Scripts. It then shows up in the AppleScript menu (the weird scrolly S), or you can get at it by bringing up Window → Palettes → Scripts. I believe two folks out there have gone down this path and shared their results:
Henk van Voorthuijsen (Lilypond.applescript extracted from MacOS 10.5 Applescript for TextWrangler thread on lilypond-devel, 21-Jul-2008)
Dr Nicola Vitacolonna (LilyPond in TextWrangler – uses TeXShop).
Create a Mac OS Service, which would potentially be a method that would be reusable across just about any text editor. This was how we used to compile Common Music files way back in the NeXT days, so I can testify to its elegance. I don't have a good up-to-date example of this, unfortunately.
Good question. It actually runs Lilypond on my system if you do this:
#!/Applications/LilyPond.app/Contents/Resources/bin/lilypond -o $1
… but fails because # is not a line-comment character so Lilypond tries to parse the line.
Surrounding it with a block comment fails because TextWrangler cannot find the ‘shebang’ line.
%{
#!/Applications/LilyPond.app/Contents/Resources/bin/lilypond -o $1
%}
An alternative is to use Smultron 3, which lets you define commands that you can run with a keyboard shortcut.
I'm running Matlab 7.8.0 under Windows.
I am calling an external utility using dos() which creates a file in the current directory.
I the file is created correctly, but it cannot be seen by exist or fopen, which return 0 and -1 respectively. The filename is correct!
>> pwd
ans =
I:\
>> ls
file1.asc file2.asc file3.asc
>> exist('file1.asc') % this file was there before
ans =
2
>> exist('file2.asc') % this file is newly created
ans =
0
to confirm it's not an odd/problematic filename, I checked from a Cygwin shell:
/cygdrive/i/ $ if [ -f file2.asc ]; then echo "OK"; fi
OK
So the file is good. I tried renaming it
/cygdrive/i/ $ mv file2.asc test
and in Matlab
>> ls
file1.asc file3.asc test
>> exist('test')
ans =
0
If I exit and restart Matlab it works fine. But I need to dynamically create the file and then access it!
Very mysterious.
You could try:
The rehash command to see if that helps.
The two-argument version of exists: exist('foo.txt', 'file')
The Matlab exist() command is not a simple filesystem operation; it also looks at variables, functions, etc. Since you're on I:, I'm assuming that's a network drive, and you're probably running in to the dir contents caching problem that Jonas mentions.
Here are a couple other workarounds, in case nsanders' two-arg exist() or Jonas' change notification fixes don't work for you.
Try using absolute paths to the files, like "fopen('I:\file2.asc')", instead of relative paths and pwd. Matlab will treat unqualified filenames as "partial paths" for both exist() and fopen(), and that interacts with the directory info caching. Ls() does not work with partial paths, which may be why it can see the file and the other functions can't.
You can use Java from within Matlab to do a simpler file existence test.
java.io.File('file2.asc').exists()
Or since the ls() command is showing the file you want, you can just implement the file existence check on top of ls.
ismember({'file2.asc'}, ls())
The "{ }" is necessary to make ismember() operate at the string level instead of the char level.
If you're still having trouble reading it, try doing a lower level read with Java from within Matlab. That will tell you whether it's specifically Matlab's I/O functions that are having trouble, or of the process itself lacks access to the file. Try this. If you get a char out of it, that means your Matlab.exe process can see the file.
istr = java.io.FileInputStream('file2.asc')
c = char(istr.read())
On Windows, I used to get change handle notification warnings at startup until I turned the warnings off. I don't have 7.8 at hand right now, but the warning may be off by default.
As explained on the MathWorks site, if Windows runs out of change notification handles, it will not be able to properly "sense" whether the content of a directory has changed, which might be causing your problems.
Are you sure that MATLAB is running as the same user as explorer is? If MATLAB requires elevated permissions to run then the drive mappings may be different and you could find that the I:\ drive is not mapped.
To fix this you would need to somehow map the I: drive under elevated permissions.