As Nasser notes in a comment every Symbol has a context. You should be aware that Symbols are created during parsing. See: http://mathematica.stackexchange.com/q/8295/121. Alright, now that we worked out what you want here is the simplified answer: We can perform a similar operation to [`BeginPackage`](http://reference.wolfram.com/mathematica/ref/BeginPackage.html) with Block: Block[{$ContextPath = {"runPrv`", "System`"}, $Context = "runPrv`"}, . . .] We can combine this with Leonid's method from http://mathematica.stackexchange.com/questions/595/is-it-possible-to-use-begin-and-end-inside-a-manipulate/598#598 to keep contexts from being fully resolved until we are ready for evaluation inside the `Block`. (Note that ``Global` `` Symbols are still created, as discussed above, but they will not be defined.) I believe ``"runPrv`"`` may be left out of `$ContextPath` in our application so long as we don't change the `$Context` from ``"runPrv`"`` within the Block itself. Finally we have: SetAttributes[runPrivate, HoldAllComplete]; runPrivate[code_] := With[{body = MakeBoxes @ code}, Block[{$ContextPath = {"System`"}, $Context = "runPrv`"}, ToExpression @ body]] Now: runPrivate[ Get["test.m"]; a = 5; test[a] ] > 5 Global Symbols `a` and `test` remain undefined: ?a ?test > Global`a > > Global`test