View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002906 | FreeCAD | Bug | public | 2017-02-17 18:16 | 2017-06-29 05:37 |
Reporter | Rubinous | Assigned To | ian.rees | ||
Priority | normal | Severity | major | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Platform | Mac | OS | macOS | OS Version | 10.12 |
Product Version | 0.16 | ||||
Fixed in Version | 0.17 | ||||
Summary | 0002906: Python API error: No module named PartDesign | ||||
Description | I have a pure python program where I try to call `doc.addObject("PartDesign::Pad","Pad")` where `doc` is a document object. This call causes the following error: `Base.FreeCADError: FreeCAD exception thrown (No module named PartDesign)`. | ||||
Steps To Reproduce | Run the following code snippet in a python console in macOS that has FreeCAD 0.16 installed in the Applications folder: ``` import sys sys.path.append(u"/Applications/FreeCAD.app/Contents/lib") import FreeCAD doc = FreeCAD.newDocument("test") doc.addObject("PartDesign::Pad","Pad") ``` | ||||
Tags | macOS, python | ||||
FreeCAD Information | |||||
|
Hi Rubinous, I'm not sure that what you're trying is meant to work - are you basing this on some existing documentation? My understanding is that the Python interpreter needs to be built with the same C compiler, as the one used to build any compiled libraries (like the ones you're trying to use in FreeCAD) used with it. So, if the build system that made your FreeCAD is not using the same compiler that (presumably Apple?) used to make the python interpreter you're using, then I wouldn't expect it to work. Could be wrong though! So, I'd suggest having a look through the "Python scripting and macros" section of the forum - https://forum.freecadweb.org/viewforum.php?f=22 and look for prior art. The most portable solution is probably to structure your script to be run from within FreeCAD's Python interpreter. The most flexible solution is probably to build FreeCAD from source on your system - it's actually pretty easy these days using Homebrew (though let someone know if you find bugs in https://www.freecadweb.org/wiki/CompileOnMac - I intend to clean up & update those soon). If you do decide this is something that is supposed to work, then could you copy-and-paste your FreeCAD version info, and the header you get when running the python interpreter in interactive mode? Thanks! (Edited to remove unintentional markup) |
|
Hi, > I'm not sure that what you're trying is meant to work - are you basing this on some existing documentation? Yes, I'm basing this on https://www.freecadweb.org/wiki/Embedding_FreeCAD > My understanding is that the Python interpreter needs to be built with the same C compiler, as the one used to build any compiled libraries (like the ones you're trying to use in FreeCAD) used with it. So, if the build system that made your FreeCAD is not using the same compiler that (presumably Apple?) used to make the python interpreter you're using, then I wouldn't expect it to work. Could be wrong though! I'm using the compiled package of FreeCAD. I tried to compile it myself earlier, but there were some issues. I'm not sure which instructions I was reading on Thursday, but https://www.freecadweb.org/wiki/CompileOnMac looks different than what I read, so I'm going to retry and report back to you. Maybe you already updated that or maybe I was reading some other instructions. > So, I'd suggest having a look through the "Python scripting and macros" section of the forum - https://forum.freecadweb.org/viewforum.php?f=22 and look for prior art. Thanks for the resource. I'm trying to do this, because I need to use FreeCAD without its GUI form my application. Coincidentally, I'm writing my application in python, so the prettiest solution would be importing FreeCAD modules to my application and calling the functions I need. What I need, is to open a FreeCAD document, change parameters of some geometrical objects, and export the 3D model in another format. The file I'm opening, has a `PartDesign::Pad` type of object in it and when I'm opening the file, it reports `Cannot create object 'Pad': (No module named PartDesign)` in the console, but the program doesn't crash. However, when I call `doc.getObject("Pad")`, it returns `None`, so clearly something went wrong. Instead of reporting this, I reported the problem with `.addObject("PartDesign::Pad", ...)` as I'm guessing these errors have the same root cause, but the `addObject` case was simpler to explain. The code works fine in the python shell found in FreeCAD GUI. But as I explained, I need to be able to use FreeCAD programmatically without opening the GUI. I'm sorry I couldn't reply during weekend. But I'm going to monitor this actively during work hours as this is highly important regarding my ongoing project. |
|
Oh, and I wanted to add that I noticed that in /Applications/FreeCAD.app/Contents/lib, the part design module is named "_PartDesign" with underscore, while all the other modules are named like "FreeCAD" or "Part" or "Path" i.e. without underscore. |
|
I successfully built the HEAD on macOS. This didn't solve my problem though. Now the bugged code can't find any modules. That's probably because the modules are not in the lib directory anymore. I added Mod directory to path as well, as that's where the modules seem to be. But those are not importable. Maybe because they're not .so files anymore. I don't know. The good news is that I found bin/FreeCADCmd, a command line utility, which I can use without the GUI. It's not as pretty as using FreeCAD modules directly in my application's python code (e.g. web server), but this'll suffice. |
|
In any case, https://www.freecadweb.org/wiki/Embedding_FreeCAD explains that you could embed FreeCAD directly to your own python application, which seems to me is currently impossible because of how the modules are organised. |
|
@Rubinous thanks for reaching out. In future please open a forum thread first to discuss your issue. We don't have our bug tracker guidelines promintently available ATM because we just upgraded the tracker and the UI is still being ported over. Here is a link to the tracker guidelines: https://www.freecadweb.org/wiki/Tracker#Reporting_bugs |
|
Also found this: > FreeCAD can be imported as a Python module, inside other applications that can run Python scripts, or in a Python console. Like in console mode, the interface part of FreeCAD is unavailable, but all geometry tools are accessible. from https://freecadweb.org/wiki/Feature_list |
|
Rubinous - Sorry about the delayed response. I think you've found a real issue, really appreciate the reporting and investigation. Glad to hear you've got FreeCAD to build! Yes, I did some reworking of the instructions, let me know if anything there was unclear. There's a CMake variable (which we probably should set to default ON, but you would've seen in the instructions) FREECAD_CREATE_MAC_APP that will cause "make install" to create a new MacOS application bundle wherever you've got the install prefix set to. That process does a bunch of rearranging and setting library paths within the bundle*, but doesn't alter the contents of the build directory. I think that, if this is going to work, you'll need to set your PYTHONPATH to point in to the application bundle you've created with that tool, rather than pointing an external Pythin at your FreeCAD build directory. * Just to complicate things, we've been doing some work on that script, and there's currently a pending PR https://github.com/FreeCAD/FreeCAD/pull/547 . That will likely be merged within hours, and could help this a lot. Probably the best plan is to wait until it's been merged, pull the latest git source, and re-run the cmake, make, and 'make install' steps. If the above doesn't work, could you share some more details on the versions of your Python (the chunk of output when the interpreter starts up, with C compiler info, would be great), OS (MacOS version, and what package manager you're using), output from "c++ --version", and FreeCAD version info (run FreeCAD GUI, start Part Design, then copy info from "About FreeCAD")? We should probably stick to the version of FreeCAD you built from source, assuming that it generally works OK in other usage. It's a moving target, but it can take a lot more effort to figure this stuff out with old code, which might've been fixed already. Once we know what's going on, we might be able to get it working with a more stable version of FC if that's important for your work. Would be great to get to the bottom of your issue, even if that means updating the documentation. Kunda1 - I think that Rubinous was fine in reporting this here. Don't want to dissuade people from reporting bugs... |
|
This isn't urgent to me anymore, because I found the FreeCADCmd. I'm now calling FreeCADCmd as a subprocess from my main python application and feeding it python scripts that I generate on the fly. It is not the prettiest solution, but it gets the work done. But I'm willing to help you debug this ticket as long as you're interested in the subject, because I want to see CAD software have better APIs. FreeCAD's API is perhaps the most potential of them all, because python is such a powerful tool to build the API on imo. Compare to e.g. SolidWorks' Visual Basic API – it's awful. I'm also looking into Onshape's web API currently as that's the only other CAD API that doesn't require opening the GUI. I will rebuild my FreeCAD with `FREECAD_CREATE_MAC_APP=1` as soon as https://github.com/FreeCAD/FreeCAD/pull/547 is merged in, add the bundle lib in `PYTHONPATH` and see if I can run the above code, and report back here. |
|
Rubinous, thanks for the offer of help. I would like to get this figured out, and update the instructions as required. Have been playing around with the issue on my machine this morning, and can reproduce what you're seeing. So, no worries about doing more testing for now. I'm curious in general about the constraints that keep you from using the Python inside FreeCAD? |
|
@ian.rees, this bug report is probably not the best medium for that discussion. Could you contact me via email? |
|
Would do, but I don't have permissions to see your email address. Mine is my username here, at gmail. I've opened issue 0002927 to fix a problem that's getting in the way of me working on your issue. I expect that'll only take a couple evenings to fix, but I probably won't have those for FreeCAD until next week sometime. |
|
FYI @Rubinous per @ian.rees > Would do, but I don't have permissions to see your email address. Mine is my username here, at gmail. |
|
Kunda1 you have edited my comment, and also and reposted part of the same comment immediately after it. The first is a bit rude, the second is nothing but unnecessary noise. What exactly are you trying to achieve/communicate/fix? Are you implying that Rubinous hasn't seen my comment? Trying to teach us that we can @mention people (who already receive email notifications)? Suggesting that we haven't moved on this item fast enough? |
|
ian.rees, linking the issue number using the mantisbt markup JIC in the future mantis will support better ticket linking, that's all. I was also making sure that OP connected with you off-tracker and that this ticket wouldn't subject to rot in the tracker like a bunch of others I've encountered. Thanks for the heads up and your feedback. I'll be less 'invasive' with tickets that you are more active on. Cheers. |
|
Rubinous, The main issue here is that FreeCAD identifies the path to modules based on the path to the current running executable - usually FreeCAD's. But, in your case, the current running executable is the external Python interpreter, and the FreeCAD modules aren't in a predetermined path relative to it. I have a fix prepared, but want to step through a few scenarios tomorrow and make sure it works well before issuing a PR. There's an additional step that might be required in setting the dynamic loader search path - this can be fixed if it's not specific to my machine. If you get an error about dlopen() not being able to find libFreeCADApp.dylib, you might need to do something like this before running your Python script: . Or, I suppose that could be done from Python too. |
|
Pull request https://github.com/FreeCAD/FreeCAD/pull/624 should fix the main issue on MacOS. I've also done a little bit of tidying up in the wiki pages mentioned above - some of those are really quite stale... |
|
FreeCAD Pull Request 624 |
|
Associated commit to ticket and closing ticket per 0002906:0008646 |
Date Modified | Username | Field | Change |
---|---|---|---|
2017-02-17 18:16 | Rubinous | New Issue | |
2017-02-18 02:10 | ian.rees | Note Added: 0008342 | |
2017-02-18 02:11 | ian.rees | Note Edited: 0008342 | |
2017-02-18 11:30 | Kunda1 | Status | new => feedback |
2017-02-20 10:11 | Rubinous | Note Added: 0008383 | |
2017-02-20 10:11 | Rubinous | Status | feedback => new |
2017-02-20 10:31 | Rubinous | Note Added: 0008384 | |
2017-02-20 13:07 | Rubinous | Note Added: 0008385 | |
2017-02-20 13:09 | Rubinous | Note Added: 0008386 | |
2017-02-20 14:06 | Kunda1 | Note Added: 0008387 | |
2017-02-20 15:26 | Rubinous | Note Added: 0008388 | |
2017-02-22 17:39 | ian.rees | Note Added: 0008408 | |
2017-02-23 20:38 | Kunda1 | Status | new => feedback |
2017-02-24 10:08 | Rubinous | Note Added: 0008418 | |
2017-02-24 10:08 | Rubinous | Status | feedback => new |
2017-02-24 20:18 | ian.rees | Assigned To | => ian.rees |
2017-02-24 20:18 | ian.rees | Status | new => assigned |
2017-02-24 20:19 | ian.rees | Status | assigned => confirmed |
2017-02-24 21:47 | ian.rees | Note Added: 0008427 | |
2017-02-28 14:12 | Rubinous | Note Added: 0008474 | |
2017-03-02 07:46 | ian.rees | Note Added: 0008497 | |
2017-03-13 15:19 | Kunda1 | Note Added: 0008620 | |
2017-03-13 15:19 | Kunda1 | Note Edited: 0008497 | |
2017-03-13 15:20 | Kunda1 | Relationship added | related to 0002927 |
2017-03-14 00:48 | ian.rees | Note Added: 0008623 | |
2017-03-14 03:48 | Kunda1 | Note Added: 0008624 | |
2017-03-17 09:15 | ian.rees | Note Added: 0008642 | |
2017-03-17 09:16 | ian.rees | Note Edited: 0008642 | |
2017-03-17 22:51 | ian.rees | Note Added: 0008646 | |
2017-05-01 22:55 | Kunda1 | Tag Attached: python | |
2017-06-29 05:11 | Kunda1 | Tag Attached: MacOSX | |
2017-06-29 05:22 | Kunda1 | Note Added: 0009597 | |
2017-06-29 05:33 | Kunda1 | Changeset attached | => FreeCAD master caee7cae |
2017-06-29 05:37 | Kunda1 | Status | confirmed => closed |
2017-06-29 05:37 | Kunda1 | Resolution | open => fixed |
2017-06-29 05:37 | Kunda1 | Fixed in Version | => 0.17 |
2017-06-29 05:37 | Kunda1 | Note Added: 0009598 | |
2020-11-13 14:08 | Kunda1 | Tag Renamed | MacOSX => macOS |