Jupyter Notebook 错误:模块“__main__”没有属性“__file__”

时间:2021-07-17 13:31:55

标签: python-3.x jupyter-notebook streamlit

我正在 Jupyter Notebook 上做一个关于 COWIN Slot Availability and Booking 的项目,但出现错误。我导入了几个库,如 hashlib 等,甚至通过使用 hash_func 绕过了它,但仍然一次又一次地出现相同的错误,并且不知道如何解决它。任何帮助将不胜感激谢谢:

代码:

    st.set_page_config(layout='wide',
                   initial_sidebar_state='collapsed',
                   page_icon="https://www.cowin.gov.in/favicon.ico",
                   page_title="CoWIN Vaccination Slot Availability")

@st.cache(allow_output_mutation=True, suppress_st_warning=True)
def load_mapping():
    df = pd.read_csv("district_mapping.csv")
    return df

def filter_column(df, col, value):
    df_temp = deepcopy(df.loc[df[col] == value, :])
    return df_temp

def filter_capacity(df, col, value):
    df_temp = deepcopy(df.loc[df[col] > value, :])
    return df_temp

@st.cache(allow_output_mutation=True)
def Pageviews():
    return []

mapping_df = load_mapping()

错误:

AttributeError                            Traceback (most recent call last)
~\Anaconda3\lib\site-packages\streamlit\hashing.py in to_bytes(self, obj, context)
    351             # Hash the input
--> 352             b = b"%s:%s" % (tname, self._to_bytes(obj, context))
    353 

~\Anaconda3\lib\site-packages\streamlit\hashing.py in _to_bytes(self, obj, context)
    607 
--> 608             if self._file_should_be_hashed(obj.__code__.co_filename):
    609                 context = _get_context(obj)

~\Anaconda3\lib\site-packages\streamlit\hashing.py in _file_should_be_hashed(self, filename)
    386         return file_util.file_is_in_folder_glob(
--> 387             filepath, self._get_main_script_directory()
    388         ) or file_util.file_in_pythonpath(filepath)

~\Anaconda3\lib\site-packages\streamlit\hashing.py in _get_main_script_directory()
    691         # script path in ScriptRunner.
--> 692         main_path = __main__.__file__
    693         return os.path.dirname(main_path)

AttributeError: module '__main__' has no attribute '__file__'

During handling of the above exception, another exception occurred:

InternalHashError                         Traceback (most recent call last)
<ipython-input-46-97857371a176> in <module>
----> 1 mapping_df = load_mapping()
      2 
      3 rename_mapping = {
      4     'date': 'Date',
      5     'min_age_limit': 'Minimum Age Limit',

~\Anaconda3\lib\site-packages\streamlit\caching.py in wrapped_func(*args, **kwargs)
    571         if show_spinner:
    572             with st.spinner(message):
--> 573                 return get_or_create_cached_value()
    574         else:
    575             return get_or_create_cached_value()

~\Anaconda3\lib\site-packages\streamlit\caching.py in get_or_create_cached_value()
    496                 # If we generated the key earlier we would only hash those
    497                 # globals by name, and miss changes in their code or value.
--> 498                 cache_key = _hash_func(func, hash_funcs)
    499 
    500             # First, get the cache that's attached to this function.

~\Anaconda3\lib\site-packages\streamlit\caching.py in _hash_func(func, hash_funcs)
    627         hash_funcs=hash_funcs,
    628         hash_reason=HashReason.CACHING_FUNC_BODY,
--> 629         hash_source=func,
    630     )
    631     cache_key = func_hasher.hexdigest()

~\Anaconda3\lib\site-packages\streamlit\hashing.py in update_hash(val, hasher, hash_reason, hash_source, context, hash_funcs)
     90 
     91     ch = _CodeHasher(hash_funcs)
---> 92     ch.update(hasher, val, context)
     93 
     94 

~\Anaconda3\lib\site-packages\streamlit\hashing.py in update(self, hasher, obj, context)
    375     def update(self, hasher, obj, context=None):
    376         """Update the provided hasher with the hash of an object."""
--> 377         b = self.to_bytes(obj, context)
    378         hasher.update(b)
    379 

~\Anaconda3\lib\site-packages\streamlit\hashing.py in to_bytes(self, obj, context)
    364 
    365         except BaseException as e:
--> 366             raise InternalHashError(e, obj)
    367 
    368         finally:

~\Anaconda3\lib\site-packages\streamlit\hashing.py in to_bytes(self, obj, context)
    350         try:
    351             # Hash the input
--> 352             b = b"%s:%s" % (tname, self._to_bytes(obj, context))
    353 
    354             # Hmmm... It's possible that the size calculation is wrong. When we

~\Anaconda3\lib\site-packages\streamlit\hashing.py in _to_bytes(self, obj, context)
    606             h = hashlib.new("md5")
    607 
--> 608             if self._file_should_be_hashed(obj.__code__.co_filename):
    609                 context = _get_context(obj)
    610                 if obj.__defaults__:

~\Anaconda3\lib\site-packages\streamlit\hashing.py in _file_should_be_hashed(self, filename)
    385             return False
    386         return file_util.file_is_in_folder_glob(
--> 387             filepath, self._get_main_script_directory()
    388         ) or file_util.file_in_pythonpath(filepath)
    389 

~\Anaconda3\lib\site-packages\streamlit\hashing.py in _get_main_script_directory()
    690         # This works because we set __main__.__file__ to the report
    691         # script path in ScriptRunner.
--> 692         main_path = __main__.__file__
    693         return os.path.dirname(main_path)
    694 

InternalHashError: module '__main__' has no attribute '__file__'

While caching the body of `load_mapping()`, Streamlit encountered an
object of type `builtins.function`, which it does not know how to hash.

**In this specific case, it's very likely you found a Streamlit bug so please
[file a bug report here.]
(https://github.com/streamlit/streamlit/issues/new/choose)**

In the meantime, you can try bypassing this error by registering a custom
hash function via the `hash_funcs` keyword in @st.cache(). For example:

```
@st.cache(hash_funcs={builtins.function: my_hash_func})
def my_func(...):
    ...
```

If you don't know where the object of type `builtins.function` is coming
from, try looking at the hash chain below for an object that you do recognize,
then pass that to `hash_funcs` instead:

```
Object of type builtins.function: <function load_mapping at 0x00000217C9C20E58>
```

Please see the `hash_funcs` [documentation]
(https://docs.streamlit.io/en/stable/caching.html#the-hash-funcs-parameter)
for more details.

1 个答案:

答案 0 :(得分:0)

您的错误 module '__main__' has no attribute '__file__' 是由于使用 jupyter notebooks 而不是 python 文件引起的。 __main__ 是顶级代码在其中执行的范围的名称 - 例如,您可能已经看到 if __name__ == '__main__'。它不存在于 jupyter notebook 中。这可以通过在 .py 文件中使用 streamlit run my_site.py 运行您的代码来解决。

相关问题