[x3d-public] x3d.py pip packake problems and potential solution

Don Brutzman brutzman at nps.edu
Thu Apr 23 12:43:05 PDT 2020


Thanks for detailed explanation.  I'll read up further on this.

Loren:  hope you can look at this issue with us also, seems fundamental.


On 4/23/2020 12:24 PM, Andreas Plesch wrote:
> Hi Don,
> 
> PyPi requirements are met but that does not necessarily mean there is
> any functionality.
> 
> I think you still need to add this line to the autogeneration of __init__.py
> 
> # import the x3d.py module
> from x3d import *
> 
> since I did not see it in the file you attached. Without it, the
> package is installed and can be imported but the imported object does
> not have any attributes or methods. With it, the x3d module from
> x3d.py gets imported and then the classes it provides exported as
> properties of the (new) module provided by the package.
> 
> It is a bit confusing since in the __init__.py file the "x3d" in "from
> x3d import *" refers to the x3d.py file included in the package while
> after installation of the x3d PyPi package 'import x3d' in a python
> script refers to the imported package.
> 
> I am not a PyPi expert and there may be other ways to properly package
> but adding the above line seemed like a good solution. I think without
> it the python system is not aware of the x3d.py file and the objects
> it provides.
> 
> Can you reproduce the error below on a system which does not
> previously have x3d.py anywhere ?
> 
>>> $ pip install x3d
>>> Collecting x3d
>>>     Downloading https://files.pythonhosted.org/packages/3b/4b/2a7cb8f738e5bf03beb729989fc1c0f52a86ddf61ea3fb38c61c55afd41b/x3d-0.0.26-py3-none-any.whl
>>> (204kB)
>>>        |████████████████████████████████| 204kB 5.6MB/s
>>> Installing collected packages: x3d
>>> Successfully installed x3d-0.0.26
>>> $ python
>>> Python 3.7.3 | packaged by conda-forge | (default, Jul  1 2019, 21:52:21)
>>> [GCC 7.3.0] :: Anaconda, Inc. on linux
>>> Type "help", "copyright", "credits" or "license" for more information.
>>>>>> import x3d
>>>>>> x3d.X3D()
>>> Traceback (most recent call last):
>>>     File "<stdin>", line 1, in <module>
>>> AttributeError: module 'x3d' has no attribute 'X3D'
> 
> -Andreas
> 
> On Thu, Apr 23, 2020 at 2:46 PM Don Brutzman <brutzman at nps.edu> wrote:
>>
>> Thanks for your note Andreas.  __init__.py is autogenerated from X3DUOM whenever producing x3d.py package.
>>
>> Latest is attached, also online at
>>
>> * https://sourceforge.net/p/x3d/code/30232/tree/www.web3d.org/x3d/stylesheets/python/x3d/
>>
>> * https://sourceforge.net/p/x3d/code/30232/tree/www.web3d.org/x3d/stylesheets/python/x3d/__init__.py
>>
>> Just rechecked, yes 'X3D' is present there on line following # Statements
>>
>> Perhaps __init__.py isn't included properly?? Everything seems to pass PyPi requirements.
>>
>> I suspect you have to either use 'X3D' or 'x3d.X3D' according to how you have imported.  All the examples I'm testing/producing avoid the prefix, but I think there is a unit test in there.  Can add more tests, or improve documentation, as you think best.
>>
>> Shouldn't matter but am using latest Python (currently 3.8.2) in my testing.
>>
>> So, not seeing something to fix... let's persist please until this is sorted out satisfactorily.
>>
>>
>>
>> On 4/23/2020 7:00 AM, Andreas Plesch wrote:
>>> Importing the x3d.py module from the x3d.py file works (if the x3d.py
>>> file is in te python path).
>>>
>>> For convenience, there is also x3d python package (pip) which is
>>> available from the pip registry and can be installed by:
>>>
>>> pip install x3d
>>>
>>> to the system python modules.
>>>
>>> However, this does not quite work:
>>>
>>> $ pip install x3d
>>> Collecting x3d
>>>     Downloading https://files.pythonhosted.org/packages/3b/4b/2a7cb8f738e5bf03beb729989fc1c0f52a86ddf61ea3fb38c61c55afd41b/x3d-0.0.26-py3-none-any.whl
>>> (204kB)
>>>        |████████████████████████████████| 204kB 5.6MB/s
>>> Installing collected packages: x3d
>>> Successfully installed x3d-0.0.26
>>> jovyan at jupyter-gesiscss-2dnotebo-2dgetting-5fstarted-2d7wbaxlkp:~$ python
>>> Python 3.7.3 | packaged by conda-forge | (default, Jul  1 2019, 21:52:21)
>>> [GCC 7.3.0] :: Anaconda, Inc. on linux
>>> Type "help", "copyright", "credits" or "license" for more information.
>>>>>> import x3d
>>>>>> x3d.X3D()
>>> Traceback (most recent call last):
>>>     File "<stdin>", line 1, in <module>
>>> AttributeError: module 'x3d' has no attribute 'X3D'
>>>
>>> I think what is needed is to actually import the module in the
>>> __init__.py file for the pip package.
>>>
>>> # __init__.py needed for properly configuring pypi distribution of
>>> x3d.py package
>>>
>>> # According to _Learning Python_ by Mark Lutz, fifth edition:
>>> # - Empty __init.py__ no longer required as of Python 3.3.  p. 761
>>> # - Using __init.py__ is performance advantage for loading, even when
>>> empty.  p. 761
>>> # - Using __all__ list to define exported values for import * is
>>> allowed but not required.  p. 735 and 771-772.
>>>
>>> # 6.4.1. Importing * From a Package
>>> # https://docs.python.org/3/tutorial/modules.html#importing-from-a-package
>>>
>>> # indicates that
>>> #     from packagename import *
>>> # "then imports whatever names are defined in the package" and
>>> # "Although certain modules are designed to export only names that
>>> follow certain patterns when you use import *,
>>> #     it is still considered bad practice in production code."
>>>
>>> # TODO testing continues to fix x3d.py package's class visibility
>>> satisfactorily for end users
>>>
>>> ## import the x3d.py module
>>> from x3d import *
>>>
>>> __all__ = [
>>>       # Field types
>>>
>>> With that change in the __init__.py file, the pip package works for me:
>>>
>>> $ python
>>> Python 3.7.6 | packaged by conda-forge | (default, Jan  7 2020, 22:33:48)
>>> [GCC 7.3.0] on linux
>>> Type "help", "copyright", "credits" or "license" for more information.
>>>>>> import x3d
>>> x3d.py package loaded, have fun with X3D Graphics!
>>>>>> x3d.X3D
>>> <class 'x3d.X3D'>
>>>>>> x3d.Box().toXML()
>>> '<Box/>\n'
>>>>>>
>>>
>>> Perhaps this change could be applied to the next release of the x3d
>>> pip package. I could not find the __init__.py file on sourceforge.
>>>
>>> Cheers,
>>>
>>> -Andreas
>>>
>>
>> all the best, Don
>> --
>> Don Brutzman  Naval Postgraduate School, Code USW/Br       brutzman at nps.edu
>> Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   +1.831.656.2149
>> X3D graphics, virtual worlds, navy robotics http://faculty.nps.edu/brutzman
> 
> 
> 

all the best, Don
-- 
Don Brutzman  Naval Postgraduate School, Code USW/Br       brutzman at nps.edu
Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   +1.831.656.2149
X3D graphics, virtual worlds, navy robotics http://faculty.nps.edu/brutzman



More information about the x3d-public mailing list