JuliaPy / JuliaPy/PyCall.jl

Multiple local imports

未关闭
#896 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Julia
星标
1.5k
派生
186
PR 合并指标
30 天内没有已合并 PR

描述

Hello!

I have a very, I think, specific issue and I would like to know, why PyCall does that and how to fix it.

Let's assume, that I have 2 folders `folder1` and `folder2` which are repositories written in python and each has a main script file `main1.py` and `main2.py`, and those two just have inside them multiple local imports and a function `main`.

Then I have two julia scripts `folder1.jl` and `folder2.jl`, which call those `main` functions from those two folders. The code for `folder1.jl` goes like this:

```julia
pushfirst!(PyVector(pyimport("sys")."path"), folder1)
execute_JL = pyimport("main1")
pyimport("importlib").reload(execute_JL)[:main](args)
```


And both julia scripts work fine. Now I want to combine them and call both scripts in the third script `combine.jl`.

This no longer works and here are two things that happen.

1. If the first element of `PyVector(pyimport("sys")."path")` is `folder1`, then I can import `main1`, if it's `folder2`, then no. But that I managed to fix this by just removing the folder from the path, once I ran the script.
2. If I do `pyimport("main1")`, I then cannot do `pyimport("main2")` and the opposite.

In both of these cases the first time you run the code the error doesn't even say anything - just that `PyObject(Ptr{PyCall.PyObject_struct} @0x00000000521c49f0), PyObject(Ptr{PyCall.PyObject_struct} @0x00000000650bf2e8), PyObject(Ptr{PyCall.PyObject_struct} @0x00000000650b58c8))`, for example. The second time you run it - all the local imports in the file that cannot be imported fail.

Can someone tell me why that happens?

P.S. As a workaround, I could probably create `setup.py` files in those folders and install them like python libraries, but I still wonder why right now I can't make this work.

贡献指南

这个仓库没有索引到贡献指南

调研方向

首先使用 main1.py 和 main2.py 重现从 folder1.jl、folder2.jl 和 combine.jl 导入的过程,然后检查第一次导入后 Python 的 sys.path 和模块状态。完成的标准是确定为什么两个本地导入树无法通过 PyCall 共存,并记录或验证一个可行的修复方案。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
backend
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
需要澄清
新手友好度
25/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。