Title: __file__ is not set correctly in subsequent script executions on the same thread · Issue #13 · scijava/scripting-jython · GitHub
Open Graph Title: __file__ is not set correctly in subsequent script executions on the same thread · Issue #13 · scijava/scripting-jython
X Title: __file__ is not set correctly in subsequent script executions on the same thread · Issue #13 · scijava/scripting-jython
Description: Given the following script: final String script = "#@output String res\n" + "import os\n" + "res = os.path.dirname(os.path.abspath(__file__)) + __file__\n"; for (int i =0; i<5; i++) { final ScriptModule m = scriptService.run("add" + i + ...
Open Graph Description: Given the following script: final String script = "#@output String res\n" + "import os\n" + "res = os.path.dirname(os.path.abspath(__file__)) + __file__\n"; for (int i =0; i<5; i++) { final ScriptM...
X Description: Given the following script: final String script = "#@output String res\n" + "import os\n" + "res = os.path.dirname(os.path.abspath(__file__)) + __file__\n"; for (int i...
Opengraph URL: https://github.com/scijava/scripting-jython/issues/13
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"__file__ is not set correctly in subsequent script executions on the same thread","articleBody":"Given the following script:\r\n\r\n```java\r\nfinal String script = \"#@output String res\\n\" + \"import os\\n\" + \"res = os.path.dirname(os.path.abspath(__file__)) + __file__\\n\";\r\nfor (int i =0; i\u003c5; i++) {\r\n\tfinal ScriptModule m = scriptService.run(\"add\" + i + \".py\", script, true).get();\r\n\tfinal Object result = m.getInfo().getLanguage().decode(m.getOutput(\"res\"));\r\n\tSystem.out.println(result);\r\n}\r\n```\r\n\r\nthe `__file__` variable will either: a) be set appropriately if this is the first time the script was run on a particular thread, or b) be unset, causing the script to fail.\r\n\r\nThe [ScriptModule](https://github.com/scijava/scijava-common/blob/3f0e32f14aa7c6f64f206d79af14c47c6aac0249/src/main/java/org/scijava/script/ScriptModule.java#L146) passes the file name to the engine. In Jython, this file name gets picked up in [the PyScriptEngine](https://github.com/jython/jython/blob/8c3734d1f09d0e2de8843c3d8f22b469b83e6860/src/org/python/jsr223/PyScriptEngine.java#L85-L89). In the pathological case, this `__file__` value is lost [here](https://github.com/jython/jython/blob/8c3734d1f09d0e2de8843c3d8f22b469b83e6860/src/org/python/jsr223/PyScriptEngine.java#L39)\r\n\r\nThis does not seem to be a core problem with the interpreter, e.g. reuse of an existing interpreter within a thread produces appropriate output:\r\n```java\r\nScriptEngineManager mgr = new ScriptEngineManager();\r\nScriptEngine pyEngine = mgr.getEngineByName(\"jython\");\r\nfinal String script = \"print __file__\\n\";\r\nfor (int i=0; i\u003c5; i++) {\r\n\tpyEngine.put(ScriptEngine.FILENAME, \"hello\" + i +\".py\");\r\n\tpyEngine.eval(script);\r\n}\r\n```\r\n\r\nHowever, in our case, a new `ScriptEngine` instance (and `interpreter` instance) is created for each execution, whether it's within the same thread or not. If we modify the previous script to do the same, we can reproduce the error:\r\n\r\n```java\r\nScriptEngineManager mgr = new ScriptEngineManager();\r\nfinal String script = \"print __file__\\n\";\r\nfor (int i=0; i\u003c5; i++) {\r\n\tScriptEngine pyEngine = mgr.getEngineByName(\"jython\");\r\n\tpyEngine.put(ScriptEngine.FILENAME, \"hello\" + i +\".py\");\r\n\tpyEngine.eval(script);\r\n}\r\n```\r\n\r\nSo this is either a bug in jython, or a misuse of the script engine on our part.","author":{"url":"https://github.com/hinerm","@type":"Person","name":"hinerm"},"datePublished":"2024-05-02T17:48:56.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/13/scripting-jython/issues/13"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:f29c7804-c9ff-ebfd-6ebe-bd07bd5d42c7 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | AC86:B1641:524029:6EFE00:696E775B |
| html-safe-nonce | 147093cb00f830dd442c04489c376a4746b7043a324135be1b4733f8ca5b5eb7 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBQzg2OkIxNjQxOjUyNDAyOTo2RUZFMDA6Njk2RTc3NUIiLCJ2aXNpdG9yX2lkIjoiNDM4NTAzNDQ0MTI5ODE3OTkzMSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | ea26c9a248595da76105c876f306938d3759bb553ca8bdb13c5958b484791955 |
| hovercard-subject-tag | issue:2276136629 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/scijava/scripting-jython/13/issue_layout |
| twitter:image | https://opengraph.githubassets.com/4b61a428fecc822e168f28fc49aeb597a7a41cbf4606bccb583038f31fb8a8d3/scijava/scripting-jython/issues/13 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/4b61a428fecc822e168f28fc49aeb597a7a41cbf4606bccb583038f31fb8a8d3/scijava/scripting-jython/issues/13 |
| og:image:alt | Given the following script: final String script = "#@output String res\n" + "import os\n" + "res = os.path.dirname(os.path.abspath(__file__)) + __file__\n"; for (int i =0; i<5; i++) { final ScriptM... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | hinerm |
| hostname | github.com |
| expected-hostname | github.com |
| None | 01185010a96388a2a8cd8bd7f5824fdf090522b219f9aecf8c7ff1857aeb489b |
| turbo-cache-control | no-preview |
| go-import | github.com/scijava/scripting-jython git https://github.com/scijava/scripting-jython.git |
| octolytics-dimension-user_id | 1262770 |
| octolytics-dimension-user_login | scijava |
| octolytics-dimension-repository_id | 19124554 |
| octolytics-dimension-repository_nwo | scijava/scripting-jython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 19124554 |
| octolytics-dimension-repository_network_root_nwo | scijava/scripting-jython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 673a80c1bce2a1e6a48b530ce2b72bf8fd253386 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width