python-remote SDK 多层目录的import,subprocess的使用就idea中环境变量

来源:互联网 发布:手机恶意坑人软件 编辑:程序博客网 时间:2024/06/02 07:02

python-remote SDK 多层目录的import,subprocess的使用就idea中环境变量

问题 1:多层目录中的import

1) 首先在idea编辑器(2017版)下

在idea编辑器下,上图图的目录结构(work space是study_and_test,下面有文件夹mod1和mod2,文件test.py),可以直接通过下面语句相互访问:
# test2.pyimport mod1.method1 as method1method1.output()# test1.pyimport mod2.method2 as method2method2.output()# test.pyimport mod1.method1 as method1import mod2.method2 as method2method1.output()method2.output()
此时的文件夹mod1和mod2默认为一个包。直接可以通过“.”引用其下的.py文件。

2)在Linux环境下(ubuntu)

在Linux环境下test.py和mod1,mod2中py文件无法访问,同时mod1和mod2中的文件也不能相互访问,这个时候只需要在各个文件夹下新建一个__init__.py文件即可把文件夹变成包,就可以访问其中的文件了,正如下图:



但是此时依然有问题,在Linux环境下直接用python file指令运行的时候只能test.py文件访问mod1和mod2文件夹下的文件,而不能mod1和mod2两个文件夹中的文件相互访问。要想1)中的代码同样可以执行,必须在mod1和mod2中的文件里加上下面语句:
import syssys.path.append('..')
加了上面的语句之后mod1和mod2中的文件就可以相互访问了,注意sys.path中存放的路径,就是import所查找的路径。这里加上“..”,表示当前目录的上一个目录,这种方式存在一个问题:python file(py文件)指令必须要在mod1或者mod2内部执行,如果是在study_and_test目录下,那么“..”表示的是study_and_test的上一个目录,所以加上绝对目录可能更好。
import syssys.path.append('/home/username/python_workspace/study_and_test')
这里还有一个知识点:当你用python-remote SDK的时候,用idea输出的sys.path和直接在Linux上用python指令运行所输出的不一样,差别就是idea输出的多了一个work space就是这里的:
'/home/username/python_workspace/study_and_test'
而且这个操作和idea中的菜单“Mark directory as”一致,换句话说,就是如果你Mark an directory as source root,那么这个directory就会出现在sys.path中,这是你import就可以找到相应的文件。并且通过这种方式import用户自定义的py文件,不需要加文件夹的名称。

问题 2: subprocess运行程序时的路径问题

这里的subprocess调用文件时默认的是从当前文件所在的位置开始调用,所以如果当前要调用的文件不在当前subprocess所在文件的文件夹下,就要就要支出被调用文件的绝对路径:
# test2.pyimport subprocesssubprocess.call(['python', '/home/username/python_workspace/study_and_test/mod1/method1.py'])

或者是通过其中的cwd 参数来指定工作路径:
# test2.pyimport subprocesssubprocess.call(['python', 'mod1/method1.py'], cwd='/home/jyzbyj/python_workspace/study_and_test')
当然这里cwd='..'即可,但是也存在与问题1中类似的问题,所以指出绝对路径更好

问题 3: idea中的环境变量

首先需要明确的是idea中远程运行的环境变量和直接在Linux中运行的环境变量是不一样的。例如我在Linux中用户主目录下的.bashrc 文件内设置目录都不会在idea的结果中出现。因为idea获得的是Linux中原始的环境变量,所以要运行我们的程序,必须要在idea中加入我们用到的库的路径,也就是环境变量。
代码:
import subprocesssubprocess.call(["echo $PATH"], shell=True)


两个结果如图:
ubuntu下:


idea远程运行结果:


idea中得到的结果只是原始的环境变量,只是在ubuntu下运行中间的一部分,可能idea得到的root的环境变量。所以如果你要用TensorFlow,同时要用GPU,那么你就应该把CUDA的库目录加到idea的环境变量中,同时要注意的是idea不支持“$VARIABLE”的形式。你需要直接写绝对路径。如下图:



这样操作以后idea得到的环境变量就加上了用户加入的环境变量。












阅读全文
0 0
原创粉丝点击