2017-06-06 129 views
0

运行的问题

我有一个基本文件结构如下所示:更改Python脚本的当前工作目录,并与-m中的Apache2

parent_dir/ 
      foo/ 
      Models.py 
      bar/ 
      NeedsModels.py 
      baz/ 
      AlsoNeedsModels.py 

在我的本地机器上,我已经运行NeedsModels.pypython3 -m

python3 -m bar.NeedsModels 

...而我的当前工作目录是parent_dir

这工作如期进行,我可以通过执行使用Models.py来自NeedsModels.pyAlsoNeedsModels.py

import foo.Models 

然而,这并不对本Apache2服务器我部署到有2个原因上工作:

  1. 当前工作目录访问NeedsModels.py不是parent_dir

  2. 该脚本未与-m一起运行。

NeedsModels.py使用标准的家当,是这样的:

#!/usr/bin/python3 -m 

...错误(Relative module names not supported),因为它是大致相当于:

python3 -m ./NeedsModels 

我(的hackish)解决方案

我找到了一个解决方案,把这个shebang放在顶部NeedsModels.py(从这question启发):

#!/bin/sh 
""":" 
cd ../ && exec python3 -m bar.NeedsModels 
""" 

显然,这是一种可怕的黑客攻击。

我读过关于CGI脚本的Apache2 docs。根据我的理解,没有提及更改脚本的当前工作目录。我也搜索了网页,并且一直无法找到任何相关信息。

期望中的答案

有没有更好的方式来运行该脚本-m和正确的工作目录在不改变项目文件结构?(我知道,移动NeedsModels.pyparent_dir会解决这个问题,但这不是我的选择。)

或者,可以在import语句,可以改变在本地和服务器上运行两个?

回答

0

您可以将foo的目录附加到sys.path。您随后可以在任何地方导入foo而无需cd

import sys 
sys.path.append('path/to/foo') 
import foo.Models 
+0

感谢您的回答。有没有办法在不改变很多文件的情况下完成这个任务?例如,'NeedsModels.py'依赖于许多使用类似'import'语句的其他项目文件。 –

+0

是的。您可以附加到.bash_rc文件中的PYTHONPATH。 sys.path实际上从那里取值。 –